SlideShare a Scribd company logo
Creating a Distribution
   Using Features, Drush Make, and more



           By Benjamin Shell
What is a Distribution?

• Drupal Installation profiles are pre-
  packaged website solutions for specic use
  cases.
• They include Drupal core as well as
  additional modules.
Confusing Terminology


 • Distributions are often called
   Installation Proles (on the
   Drupal.org download page among places)
Installation Proles vs
     Distributions
• Installation profiles are scripts that
  run once when Drupal is installed.
  Installation proles provide an installation
  process that differs from the default install.
• Distributions are full copies of Drupal
  that include extra things aren't in the
  regular Drupal download. These extras
  typically include installation proles and
  additional modules and themes.
History
• Support for custom Installation Profiles was
  added in Drupal 5
• Until recently downloading an Installation
  Prole from Drupal.org was just that, an
  Installation Prole
• The Drupal.org packaging script now
  automatically packages core and contrib
  modules into a Distribution
Popular Distributions




      Open Atrium
Popular Distributions




      Open Scholar
Popular Distributions




     Drupal Commons
Popular Distributions




      Managing News
Why Build a
        Distribution?

• Building multiple similar sites
• Giving back to the community
• Encouraging community involvement with
  your project
Components
Distribution

                Contrib      Custom
  Drupal                                     Installation
               Modules &    Modules &
  Core                                         Prole
                Themes       Themes



                Including Features Modules
Steps to Creating a
         Distribution
•   Build a new Drupal site to use as a template
•   Move configuration (node types, views, etc.) into code
    (Features modules)
•   Create an Installation Profile for setting up a new site
•   Create a .make file for downloading resources
•   Test and Release
Building the Site
Creating Features
    Modules
Creating an Installation
        Prole
/**
* Implement hook_install().
*
* Perform actions to set up the site for this profile.
*/
function mydistro_install() {
   include_once DRUPAL_ROOT . '/profiles/standard/standard.install';
   standard_install();

    // Do other things here. For example, let’s change the theme:
    theme_enable(array('photoblog', 'seven'));
    variable_set('theme_default', 'photoblog');
    variable_set('admin_theme', 'seven');
}
Drush and Drush Make

• Drush is a command line tool for Drupal:
  http://drupal.org/project/drush
• Drush Make is an extension to Drush:
  http://drupal.org/project/drush_make
Create a .make le

• This tells the Drupal.org packaging script
  which contrib modules and themes to
  include in your distribution
• Can be make-generate mydistro.make
  drush
         created automatically:
Make File Format
;   $Id$
;
;   Example makefile
;   ----------------
;   This is an example makefile to introduce new users of drush_make to the
;   syntax and options available to drush_make. For a full description of all
;   options available, see README.txt.

; This make file is a working makefile - try it! Any line starting with a `;`
; is a comment.

;   Core version
;   ------------
;   Each makefile should begin by declaring the core version of Drupal that all
;   projects should be compatible with.

core = 6.x

;   API version
;   ------------
;   Every makefile needs to declare it's Drush Make API version. This version of
;   drush make uses API version `2`.

api = 2




                                  Part 1 of 3
;   Core project
;   ------------
;   In order for your makefile to generate a full Drupal site, you must include
;   a core project. This is usually Drupal core, but you can also specify
;   alternative core projects like Pressflow. Note that makefiles included with
;   install profiles *should not* include a core project.

; Use pressflow instead of Drupal core:
; projects[pressflow][type] = "core"
; projects[pressflow][download][type] = "file"
; projects[pressflow][download][url] = "http://launchpad.net/pressflow/6.x/6.15.73/+download/
pressflow-6.15.73.tar.gz"

;   CVS checkout of Drupal 6.x core:
;   projects[drupal][type] = "core"
;   projects[drupal][download][type] = "cvs"
;   projects[drupal][download][root] = ":pserver:anonymous:anonymous@cvs.drupal.org:/cvs/drupal"
;   projects[drupal][download][revision] = "DRUPAL-6"
;   projects[drupal][download][module] = "drupal"

;   CVS checkout of Drupal 7.x. Requires the `core` property to be set to 7.x.
;   projects[drupal][type] = "core"
;   projects[drupal][download][type] = "cvs"
;   projects[drupal][download][root] = ":pserver:anonymous:anonymous@cvs.drupal.org:/cvs/drupal"
;   projects[drupal][download][revision] = "HEAD"
;   projects[drupal][download][module] = "drupal"

projects[] = drupal




                                  Part 2 of 3
; Projects
; --------
; Each project that you would like to include in the makefile should be
; declared under the `projects` key. The simplest declaration of a project
; looks like this:
projects[] = views

;   This will, by default, retrieve the latest recommended version of the project
;   using its update XML feed on Drupal.org. If any of those defaults are not
;   desirable for a project, you will want to use the keyed syntax combined with
;   some options.

; If you want to retrieve a specific version of a project:
projects[cck] = 2.6

; Or an alternative, extended syntax:
projects[ctools][version] = 1.3

; Check out the latest version of a project from CVS. Note that when using a
; repository as your project source, you must explictly declare the project
; type so that drush_make knows where to put your project.
projects[data][type] = module
projects[data][download][type] = cvs
projects[data][download][module] = contributions/modules/data
projects[data][download][revision] = DRUPAL-6--1

; Clone a project from github.
projects[tao][type] = theme
projects[tao][download][type] = git
projects[tao][download][url] = git://github.com/developmentseed/tao.git

; If you want to install a module into a sub-directory, you can use the
; `subdir` attribute.
projects[admin_menu][subdir] = custom

; To apply a patch to a project, use the `patch` attribute and pass in the URL
; of the patch.
projects[admin_menu][patch][] = "http://drupal.org/files/issues/admin_menu.long_.31.patch"


                                  Part 3 of 3
Creating a .make le
Testing
(We finally get to use the “Drush Make” command.)

• Put your .make file in a new folder
• Run: drush make mydistro.make
• After the build, put your profile module in
  the proles directory of the new Drupal
  site
• Install Drupal, choosing your Installation
  Prole
Releasing a Distribution
    on Drupal.org
From http://drupal.org/node/642116:
•   Verify the .make file
•   Name the .make file drupal-org.make
•   Add the .make file to your Installation Profile
•   Create a Drupal project or sandbox page
•   Commit your Installation Profile directory to Git

 (These steps aren’t necessary if you don’t
  release your distribution on Drupal.org)
Verifying the Make File

• This tests to ensure the .make file is in the
  correct format for Drupal.org
• Run:
  drush verify-makefile profiles/mydistro/drupal-org.make
Setup a Drupal.org
   Project or Sandbox
• Anyone can create a sandbox project
• Sandbox projects can be promoted to full
  projects
• Choose “Installation Profile” as the type of
  project
Get Ready for Release
• Custom module and themes (not released
  elsewhere) can be added to the installation
  prole in subdirectory: /proles/mydistro/
  modules/myspecialmodule
• Run git   init in your installation profile
  folder, then follow instructions on your
  project/sandbox page to commit your code
  and push it to Drupal.org
Push your code to
       Drupal.org
• The Drupal.org packaging system uses
  your .make le to download core and the
  contrib module/themes specied
• Your installation profile is moved to a
  subdirectory of the build (/proles/mydistro)
• Contrib modules/themes are put in
  /proles/mydistro/modules and /proles/
  mydistro/themes
For More Information
• General information about Distributions
  and Installation Proles: http://drupal.org/
  node/1089736
• Drupal Groups for Distributions: http://
  drupal.org/node/1089736
• Releasing a Distribution on Drupal.org:
  http://drupal.org/node/642116
Any Questions?

More Related Content

What's hot (20)

PDF
Drupal 8 - A Brief Introduction
Jeff Geerling
 
PDF
Site Building Checklist DrupalCamp Ottawa
Suzanne Dergacheva
 
ODP
Drupal - Blocks vs Context vs Panels
David Burns
 
PPTX
Top 20 mistakes you will make on your 1st Drupal project
Iztok Smolic
 
PDF
A Custom Drupal Theme in 40 Minutes
Snake Hill Web Agency
 
PDF
Introduction to Drupal Basics
Juha Niemi
 
PDF
Introduction to the Drupal - Web Experience Toolkit
Suzanne Dergacheva
 
PPTX
Using Foundation with Drupal
Exove
 
PDF
The Foundations of Being Sassy in Drupal
Ellie Roepken
 
PPTX
Anatomy and Architecture of a WordPress Theme
Julie Kuehl
 
PDF
Upgrading to Drupal 8: Benefits and Gotchas
Suzanne Dergacheva
 
PDF
Best Practice Checklist for Building a Drupal Website
Acquia
 
PDF
WordPress as a CMS - Case Study of an Organizational Intranet
Tech Liminal
 
PDF
WordPress and The Command Line
Kelly Dwan
 
PDF
Drupal
Isriya Paireepairit
 
PPTX
Wordpress theme development
Naeem Junejo
 
PPTX
Introduction to Wordpress
Md Farhad Hussain mun
 
KEY
Simplifying End-user Drupal 7 Content Administration
Aidan Foster
 
PPT
Intro to CakePHP 1.3
Adam Culp
 
ODP
Drupal Now! - Introduction to Drupal
Alozie Nwosu
 
Drupal 8 - A Brief Introduction
Jeff Geerling
 
Site Building Checklist DrupalCamp Ottawa
Suzanne Dergacheva
 
Drupal - Blocks vs Context vs Panels
David Burns
 
Top 20 mistakes you will make on your 1st Drupal project
Iztok Smolic
 
A Custom Drupal Theme in 40 Minutes
Snake Hill Web Agency
 
Introduction to Drupal Basics
Juha Niemi
 
Introduction to the Drupal - Web Experience Toolkit
Suzanne Dergacheva
 
Using Foundation with Drupal
Exove
 
The Foundations of Being Sassy in Drupal
Ellie Roepken
 
Anatomy and Architecture of a WordPress Theme
Julie Kuehl
 
Upgrading to Drupal 8: Benefits and Gotchas
Suzanne Dergacheva
 
Best Practice Checklist for Building a Drupal Website
Acquia
 
WordPress as a CMS - Case Study of an Organizational Intranet
Tech Liminal
 
WordPress and The Command Line
Kelly Dwan
 
Wordpress theme development
Naeem Junejo
 
Introduction to Wordpress
Md Farhad Hussain mun
 
Simplifying End-user Drupal 7 Content Administration
Aidan Foster
 
Intro to CakePHP 1.3
Adam Culp
 
Drupal Now! - Introduction to Drupal
Alozie Nwosu
 

Similar to Building a Drupal Distribution using Features, Drush Make, Installation Profiles, and more (20)

PDF
Get Up and Running Quickly with Drupal Distributions
Melissa Piper
 
PDF
Building and Maintaining a Distribution in Drupal 7 with Features
Nuvole
 
ODP
Drupal distributions - how to build them
Dick Olsson
 
PDF
Drupal distributions and installation profiles
Andrei Jechiu
 
PDF
Drupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond
DrupalDay
 
PDF
Recipes for Drupal distributions
Lakshmi Narasimhan Parthasarathy
 
KEY
Automating Drupal Development: Makefiles, features and beyond
Nuvole
 
PPT
Doing Drupal: Quick Start Deployments via Distributions
Thom Bunting
 
KEY
Drush make - Install Drupal like a Pro
rupl
 
PDF
Best Practices for Development Deployment & Distributions: Capital Camp + Gov...
Phase2
 
PPT
Intro to Drush
David Watson
 
PDF
Beginning Drush
Mediacurrent
 
PDF
Speed up Drupal development with Drush
kbasarab
 
PPT
Distribution Deli
Wylbur
 
PDF
Drupal: Reusing functionality
Raymond Muilwijk
 
PDF
Introduction to Drupal - Installation, Anatomy, Terminologies
Gerald Villorente
 
PDF
Modernize Your Drupal Development
Chris Tankersley
 
PDF
Sergei Stryukov.Drush.Why it should be used.DrupalCamp Kyiv 2011
camp_drupal_ua
 
ODP
Features & Installation Profiles
David Watson
 
Get Up and Running Quickly with Drupal Distributions
Melissa Piper
 
Building and Maintaining a Distribution in Drupal 7 with Features
Nuvole
 
Drupal distributions - how to build them
Dick Olsson
 
Drupal distributions and installation profiles
Andrei Jechiu
 
Drupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond
DrupalDay
 
Recipes for Drupal distributions
Lakshmi Narasimhan Parthasarathy
 
Automating Drupal Development: Makefiles, features and beyond
Nuvole
 
Doing Drupal: Quick Start Deployments via Distributions
Thom Bunting
 
Drush make - Install Drupal like a Pro
rupl
 
Best Practices for Development Deployment & Distributions: Capital Camp + Gov...
Phase2
 
Intro to Drush
David Watson
 
Beginning Drush
Mediacurrent
 
Speed up Drupal development with Drush
kbasarab
 
Distribution Deli
Wylbur
 
Drupal: Reusing functionality
Raymond Muilwijk
 
Introduction to Drupal - Installation, Anatomy, Terminologies
Gerald Villorente
 
Modernize Your Drupal Development
Chris Tankersley
 
Sergei Stryukov.Drush.Why it should be used.DrupalCamp Kyiv 2011
camp_drupal_ua
 
Features & Installation Profiles
David Watson
 
Ad

Recently uploaded (20)

PPTX
OA presentation.pptx OA presentation.pptx
pateldhruv002338
 
PDF
Market Insight : ETH Dominance Returns
CIFDAQ
 
PDF
Trying to figure out MCP by actually building an app from scratch with open s...
Julien SIMON
 
PDF
Research-Fundamentals-and-Topic-Development.pdf
ayesha butalia
 
PDF
Structs to JSON: How Go Powers REST APIs
Emily Achieng
 
PDF
Generative AI vs Predictive AI-The Ultimate Comparison Guide
Lily Clark
 
PPTX
The Future of AI & Machine Learning.pptx
pritsen4700
 
PDF
OFFOFFBOX™ – A New Era for African Film | Startup Presentation
ambaicciwalkerbrian
 
PDF
GDG Cloud Munich - Intro - Luiz Carneiro - #BuildWithAI - July - Abdel.pdf
Luiz Carneiro
 
PDF
Make GenAI investments go further with the Dell AI Factory
Principled Technologies
 
PPTX
Applied-Statistics-Mastering-Data-Driven-Decisions.pptx
parmaryashparmaryash
 
PPTX
AVL ( audio, visuals or led ), technology.
Rajeshwri Panchal
 
PPTX
What-is-the-World-Wide-Web -- Introduction
tonifi9488
 
PDF
The Future of Artificial Intelligence (AI)
Mukul
 
PPTX
AI and Robotics for Human Well-being.pptx
JAYMIN SUTHAR
 
PPTX
AI Code Generation Risks (Ramkumar Dilli, CIO, Myridius)
Priyanka Aash
 
PDF
Economic Impact of Data Centres to the Malaysian Economy
flintglobalapac
 
PDF
State-Dependent Conformal Perception Bounds for Neuro-Symbolic Verification
Ivan Ruchkin
 
PDF
Data_Analytics_vs_Data_Science_vs_BI_by_CA_Suvidha_Chaplot.pdf
CA Suvidha Chaplot
 
PDF
RAT Builders - How to Catch Them All [DeepSec 2024]
malmoeb
 
OA presentation.pptx OA presentation.pptx
pateldhruv002338
 
Market Insight : ETH Dominance Returns
CIFDAQ
 
Trying to figure out MCP by actually building an app from scratch with open s...
Julien SIMON
 
Research-Fundamentals-and-Topic-Development.pdf
ayesha butalia
 
Structs to JSON: How Go Powers REST APIs
Emily Achieng
 
Generative AI vs Predictive AI-The Ultimate Comparison Guide
Lily Clark
 
The Future of AI & Machine Learning.pptx
pritsen4700
 
OFFOFFBOX™ – A New Era for African Film | Startup Presentation
ambaicciwalkerbrian
 
GDG Cloud Munich - Intro - Luiz Carneiro - #BuildWithAI - July - Abdel.pdf
Luiz Carneiro
 
Make GenAI investments go further with the Dell AI Factory
Principled Technologies
 
Applied-Statistics-Mastering-Data-Driven-Decisions.pptx
parmaryashparmaryash
 
AVL ( audio, visuals or led ), technology.
Rajeshwri Panchal
 
What-is-the-World-Wide-Web -- Introduction
tonifi9488
 
The Future of Artificial Intelligence (AI)
Mukul
 
AI and Robotics for Human Well-being.pptx
JAYMIN SUTHAR
 
AI Code Generation Risks (Ramkumar Dilli, CIO, Myridius)
Priyanka Aash
 
Economic Impact of Data Centres to the Malaysian Economy
flintglobalapac
 
State-Dependent Conformal Perception Bounds for Neuro-Symbolic Verification
Ivan Ruchkin
 
Data_Analytics_vs_Data_Science_vs_BI_by_CA_Suvidha_Chaplot.pdf
CA Suvidha Chaplot
 
RAT Builders - How to Catch Them All [DeepSec 2024]
malmoeb
 
Ad

Building a Drupal Distribution using Features, Drush Make, Installation Profiles, and more

  • 1. Creating a Distribution Using Features, Drush Make, and more By Benjamin Shell
  • 2. What is a Distribution? • Drupal Installation proles are pre- packaged website solutions for specic use cases. • They include Drupal core as well as additional modules.
  • 3. Confusing Terminology • Distributions are often called Installation Proles (on the Drupal.org download page among places)
  • 4. Installation Proles vs Distributions • Installation proles are scripts that run once when Drupal is installed. Installation proles provide an installation process that differs from the default install. • Distributions are full copies of Drupal that include extra things aren't in the regular Drupal download. These extras typically include installation proles and additional modules and themes.
  • 5. History • Support for custom Installation Proles was added in Drupal 5 • Until recently downloading an Installation Prole from Drupal.org was just that, an Installation Prole • The Drupal.org packaging script now automatically packages core and contrib modules into a Distribution
  • 6. Popular Distributions Open Atrium
  • 7. Popular Distributions Open Scholar
  • 8. Popular Distributions Drupal Commons
  • 9. Popular Distributions Managing News
  • 10. Why Build a Distribution? • Building multiple similar sites • Giving back to the community • Encouraging community involvement with your project
  • 11. Components Distribution Contrib Custom Drupal Installation Modules & Modules & Core Prole Themes Themes Including Features Modules
  • 12. Steps to Creating a Distribution • Build a new Drupal site to use as a template • Move conguration (node types, views, etc.) into code (Features modules) • Create an Installation Prole for setting up a new site • Create a .make le for downloading resources • Test and Release
  • 14. Creating Features Modules
  • 15. Creating an Installation Prole /** * Implement hook_install(). * * Perform actions to set up the site for this profile. */ function mydistro_install() { include_once DRUPAL_ROOT . '/profiles/standard/standard.install'; standard_install(); // Do other things here. For example, let’s change the theme: theme_enable(array('photoblog', 'seven')); variable_set('theme_default', 'photoblog'); variable_set('admin_theme', 'seven'); }
  • 16. Drush and Drush Make • Drush is a command line tool for Drupal: http://drupal.org/project/drush • Drush Make is an extension to Drush: http://drupal.org/project/drush_make
  • 17. Create a .make le • This tells the Drupal.org packaging script which contrib modules and themes to include in your distribution • Can be make-generate mydistro.make drush created automatically:
  • 18. Make File Format ; $Id$ ; ; Example makefile ; ---------------- ; This is an example makefile to introduce new users of drush_make to the ; syntax and options available to drush_make. For a full description of all ; options available, see README.txt. ; This make file is a working makefile - try it! Any line starting with a `;` ; is a comment. ; Core version ; ------------ ; Each makefile should begin by declaring the core version of Drupal that all ; projects should be compatible with. core = 6.x ; API version ; ------------ ; Every makefile needs to declare it's Drush Make API version. This version of ; drush make uses API version `2`. api = 2 Part 1 of 3
  • 19. ; Core project ; ------------ ; In order for your makefile to generate a full Drupal site, you must include ; a core project. This is usually Drupal core, but you can also specify ; alternative core projects like Pressflow. Note that makefiles included with ; install profiles *should not* include a core project. ; Use pressflow instead of Drupal core: ; projects[pressflow][type] = "core" ; projects[pressflow][download][type] = "file" ; projects[pressflow][download][url] = "http://launchpad.net/pressflow/6.x/6.15.73/+download/ pressflow-6.15.73.tar.gz" ; CVS checkout of Drupal 6.x core: ; projects[drupal][type] = "core" ; projects[drupal][download][type] = "cvs" ; projects[drupal][download][root] = ":pserver:anonymous:[email protected]:/cvs/drupal" ; projects[drupal][download][revision] = "DRUPAL-6" ; projects[drupal][download][module] = "drupal" ; CVS checkout of Drupal 7.x. Requires the `core` property to be set to 7.x. ; projects[drupal][type] = "core" ; projects[drupal][download][type] = "cvs" ; projects[drupal][download][root] = ":pserver:anonymous:[email protected]:/cvs/drupal" ; projects[drupal][download][revision] = "HEAD" ; projects[drupal][download][module] = "drupal" projects[] = drupal Part 2 of 3
  • 20. ; Projects ; -------- ; Each project that you would like to include in the makefile should be ; declared under the `projects` key. The simplest declaration of a project ; looks like this: projects[] = views ; This will, by default, retrieve the latest recommended version of the project ; using its update XML feed on Drupal.org. If any of those defaults are not ; desirable for a project, you will want to use the keyed syntax combined with ; some options. ; If you want to retrieve a specific version of a project: projects[cck] = 2.6 ; Or an alternative, extended syntax: projects[ctools][version] = 1.3 ; Check out the latest version of a project from CVS. Note that when using a ; repository as your project source, you must explictly declare the project ; type so that drush_make knows where to put your project. projects[data][type] = module projects[data][download][type] = cvs projects[data][download][module] = contributions/modules/data projects[data][download][revision] = DRUPAL-6--1 ; Clone a project from github. projects[tao][type] = theme projects[tao][download][type] = git projects[tao][download][url] = git://github.com/developmentseed/tao.git ; If you want to install a module into a sub-directory, you can use the ; `subdir` attribute. projects[admin_menu][subdir] = custom ; To apply a patch to a project, use the `patch` attribute and pass in the URL ; of the patch. projects[admin_menu][patch][] = "http://drupal.org/files/issues/admin_menu.long_.31.patch" Part 3 of 3
  • 21. Creating a .make le
  • 22. Testing (We nally get to use the “Drush Make” command.) • Put your .make le in a new folder • Run: drush make mydistro.make • After the build, put your prole module in the proles directory of the new Drupal site • Install Drupal, choosing your Installation Prole
  • 23. Releasing a Distribution on Drupal.org From http://drupal.org/node/642116: • Verify the .make le • Name the .make le drupal-org.make • Add the .make le to your Installation Prole • Create a Drupal project or sandbox page • Commit your Installation Prole directory to Git (These steps aren’t necessary if you don’t release your distribution on Drupal.org)
  • 24. Verifying the Make File • This tests to ensure the .make le is in the correct format for Drupal.org • Run: drush verify-makefile profiles/mydistro/drupal-org.make
  • 25. Setup a Drupal.org Project or Sandbox • Anyone can create a sandbox project • Sandbox projects can be promoted to full projects • Choose “Installation Prole” as the type of project
  • 26. Get Ready for Release • Custom module and themes (not released elsewhere) can be added to the installation prole in subdirectory: /proles/mydistro/ modules/myspecialmodule • Run git init in your installation prole folder, then follow instructions on your project/sandbox page to commit your code and push it to Drupal.org
  • 27. Push your code to Drupal.org • The Drupal.org packaging system uses your .make le to download core and the contrib module/themes specied • Your installation prole is moved to a subdirectory of the build (/proles/mydistro) • Contrib modules/themes are put in /proles/mydistro/modules and /proles/ mydistro/themes
  • 28. For More Information • General information about Distributions and Installation Proles: http://drupal.org/ node/1089736 • Drupal Groups for Distributions: http:// drupal.org/node/1089736 • Releasing a Distribution on Drupal.org: http://drupal.org/node/642116

Editor's Notes