SlideShare a Scribd company logo
Pantheon.io / Prometsource.com
JULY 22-24, 2015
NATIONAL INSTITUTES OF HEALTH CAMPUS
BETHESDA, MD
Composer Tools and Frameworks for Drupal
Pantheon.io / Prometsource.com
Why you should care about composer
Today
➢ Dependency Management Hell
➢ Manually Include Classes at runtime
➢ Large unmanagable repository
➢ Composer manages dependencies
➢ Autoloader lazy-includes class files
➢ Repository remains clean and lean
With Composer
Pantheon.io / Prometsource.com
Composer Tools and Frameworks for Drupal
+ =+
COMPOSER DRUPAL DRUSH WIN
Pantheon.io / Prometsource.com 4
Who Are We?
Greg Anderson
Doug Dobrzynski
Pantheon.io / Prometsource.com 5
Who Are We?
Allan Chappell
Senior Solutions Architect
Pantheon.io / Prometsource.com 6
Agenda
‣What is Composer?
‣Installing Drupal 7 with Composer
•composer_vendor + custom-installer
•drupal-tangler
‣Managing Your Project
Pantheon.io / Prometsource.com
WHAT IS COMPOSER?
PART
ONE
Pantheon.io / Prometsource.com 8
What Is Composer?
An Installer A Dependency Manager An Autoloader
{
"require": {
"php": ">=5.4.0",
"symfony/browser-kit": "~2.1",
"symfony/css-selector": "~2.1",
"symfony/dom-crawler": "~2.1",
"guzzlehttp/guzzle": ">=4,<6"
},
…
}
Evaluate and select <?php
$client = new GuzzleHttpClient();
>=4,<6
guzzlehttp/guzzle
5.*
guzzlehttp/guzzle
v5.2.0
guzzlehttp/guzzle
"autoload": {
"psr-4": {
"GuzzleHttp": "src/"
}
},
composer.json
Pantheon.io / Prometsource.com 9
Why Use Composer?
‣Standard
‣Easiest for developers
•Dependency resolution
•Code updates
•Autoloading of classes
‣Composer is being adopted everywhere
Pantheon.io / Prometsource.com 1
What Projects Are Using Composer?
Not Using Composer
… and many others!
http/guzzle
fabpot/goutteDrupal Modules Drush Extensions
PHP APIs
symfony/yaml
twig/twig
Not Using ComposerUsing Composer
Pantheon.io / Prometsource.com 11
Drupal 7 and Composer
Can we do this?
?+ =
Pantheon.io / Prometsource.com 12
Composer Parts of the Whole
Composer
PHP
dependency
management
software.
Packagist
A software
repository
manager.
Custom Installer
An executable
Composer
component.
Optional.
autoload.php
A generated file
that must be
included
by your app.
composer.json
A structured file
that defines a
project.
Pantheon.io / Prometsource.com 13
Repository Data for Drupal Projects
packagist.drupal-composer.org
A third-party repository
containing data on projects
from drupal.org.
Pantheon.io / Prometsource.com 14
Semantic Versioning
Drupal Module Version
7.x-1.5
DRUPAL-x.MODULE.MINOR
Versions are converted to semantic versioning before being
published on packagist.drupal-composer.org.
7.1.5
MAJOR.MINOR.PATCH
Composer Version
Pantheon.io / Prometsource.com 15
Comparison with Drush Make
composer.json
Repository and
custom installers
(previously
explained)
Drupal module that
provides an autoload
strategy (next).
Drush Make
{
"name": "organization/project",
"description": "Drupal composer.json file",
"repositories": [
{
"type": "composer",
"url": "http://packagist.drupal-composer.org/"
}
],
"require": {
"davidbarratt/custom-installer": "dev-master",
"derhasi/composer-preserve-paths": "0.1.*",
"drupal/drupal": "7.*",
"drupal/composer_vendor": "7.1.*",
"http/guzzle": "~5",
"drupal/devel": "7.1.*",
},
…
}
; Drush make file that uses guzzle
; API
api = 2
; Core
core = 7.x
; Drupal project.
projects[drupal][type] = core
projects[drupal][version] = 7.x
projects[drupal][download][type] = git
projects[drupal][download][branch] = 7.x
; Modules
projects[] = composer_manager
projects[] = aws_glacier
projects[] = devel
Pantheon.io / Prometsource.com 16
Autoloading in PHP
"autoload": {
"psr-4": {
"GuzzleHttp": "src/"
}
},
composer.json from guzzlehttp/guzzle
autoload_psr4.php generated by Composer via composer install
$vendorDir = dirname(dirname(__FILE__));
return array(
'GuzzleHttp' => array($vendorDir .
'/guzzlehttp/guzzle/src'),
);
Saves one line of code per class - but it’s a very important line!
RUN TIME INSTALL TIME
<?php
include "vendor/autoload.php";
$client = new GuzzleHTTPClient();
php source file that calls GuzzleHTTP
$map = require __DIR__ . '/autoload_psr4.php';
foreach ($map as $namespace => $path) {
$loader->setPsr4($namespace, $path);
}
Composer autoloader registration called from vendor/autoload.php
include $vendorDir . '/guzzlehttp/guzzle/src/Client.php';
Pantheon.io / Prometsource.com 17
Custom Installers for Composer + D7
generalredneck/drupal-libraries-installer-plugin
promet/drupal-tangler
derhasi/composer-preserve-paths
davidbarratt/custom-installer
OR
OPTIONAL
netresearch/composer-patches-plugin
Allows composer.json files to specify where
components get installed.
Allows nested installation of composer libraries (e.
g. Drupal modules inside of
Drupal core).
Installs modules and themes to their standard
location in the vendor directory, and symlinks
to them from sites/all/modules/contrib or
copies them to sites/all/modules/contrib.
Allows composer.json files to specify where
components get installed.
Allows patch files to be applied to Drupal core
or contrib modules after Composer installs
them.
Pantheon.io / Prometsource.com 18
Adding Composer Support
To make this work, we just need to include vendor/autoload.php
+ =
Pantheon.io / Prometsource.com
INSTALLING DRUPAL 7 WITH
COMPOSER
PART
TWO
Pantheon.io / Prometsource.com
Searches for
composer.json files
in every module
and dynamically
merges them.
20
Composer Options for Drupal 7
composer_autoload composer_manager
Fragile Complex
Searches for
autoload.php files
in every module
directory and loads
them individually.
Pantheon.io / Prometsource.com
Writes a settings.php
file that loads the correct
autoload.php file.
Loads the
sites/all/vendor/au
toload.php
file.
21
Better Options for Drupal 7
composer_vendor promet/drupal-tangler
Wins! Wins!
Pantheon.io / Prometsource.com 22
Directory Structure
mydrupalsite.org
composer.json
composer.lock
htdocs
sites
default
settings.php
files
all
modules
We create a new top-level directory for our project,
because composer cannot manage dependencies in
the same directory as composer.json.
We will put our Drupal root directory in htdocs.
Tangler defaults to www but allows the option to
specify a different name.
With drupal-tangler
Pantheon.io / Prometsource.com 23
Directory Structure
mydrupalsite.org
vendor
drupal
views
composer
htdocs
sites
default
vendor -> ../../../vendor
all
modules
contrib
views -> ../../../../../vendor/drupal/views
We put the vendor directory in root because that
is the default location for the Composer installer.
The directory is organized by vendor name.
Each contributed module directory is symlinked
to the corresponding directory in vendor.
With drupal-tangler
Pantheon.io / Prometsource.com 24
Directory Structure
mydrupalsite.org
modules
custom
feature_modules
htdocs
sites
all
modules
custom -> ../../../../modules/custom
feature_modules ->
../../../../modules/feature_modules
We put custom modules in the custom directory
in the modules directory in root.
The feature_modules directory is symlinked to
the feature_modules directory in the modules
directory in root.
With drupal-tangler
We will put our Drupal root directory in htdocs.
Tangler defaults to www but allows the option to
specify a different name.
The custom directory is symlinked to the custom
directory in the modules directory in root.
Pantheon.io / Prometsource.com 25
Directory Structure
mydrupalsite.org
cnf
config.yml.dist
config.yml
htdocs
sites
default
settings.php
We put default configuration for settings in
config.yml.dist.
We put default configuration for settings in
config.yml.dist.
The settings.php file is generated by
settings_compile from config.yml. If config.
yml does not exist, it is generated from config.
yml.dist.
With drupal-tangler
Pantheon.io / Prometsource.com 26
Use Installation Profiles
mydrupalsite.org
vendor
drupal
panopoly
htdocs
profiles
panopoly -> ../../vendor/drupal/panopoly
Composer downloads the profile to the drupal
directory in the vendor directory.
The panopoly directory is symlinked to the
panopoly directory in the vendor directory.
With drupal-tangler
Pantheon.io / Prometsource.com 27
Directory Structure
mydrupalsite.org
composer.json
composer.lock
htdocs
sites
default
settings.php
files
all
modules
vendor
We create a new top-level directory for our project,
because composer cannot manage dependencies in
the same directory as composer.json.
We will put our Drupal root directory in htdocs.
We put the vendor directory in
sites/all/vendor because that is where the
composer_vendor project expects to find it.
With composer_vendor
Pantheon.io / Prometsource.com 28
Place the Vendor Directory
composer.json
{
"require": {
…
},
"config": {
"vendor-dir": "htdocs/sites/all/vendor"
},
…
}
For composer_vendor with a custom-installer
Pantheon.io / Prometsource.com 29
Place Modules and Themes
{
"require": {
"davidbarratt/custom-installer": "dev-master",
…
},
"extra": {
"custom-installer": {
"drupal-module": "htdocs/sites/all/modules/contrib/{$name}/",
"drupal-theme": "htdocs/sites/all/themes/contrib/{$name}/"
},
},
…
}
composer.json
For composer_vendor with a custom-installer
Pantheon.io / Prometsource.com 30
Use Installation Profiles
{
"require": {
"davidbarratt/custom-installer": "dev-master",
"drupal/panopoly": "7.1.*",
…
},
"extra": {
"custom-installer": {
"drupal-profile": "htdocs/profiles/{$name}/"
},
},
…
}
composer_vendor
composer.json
For composer_vendor with a custom-installer
Pantheon.io / Prometsource.com 31
Downloading Modules
$ drush dl devel
Project devel (7.x-1.5) downloaded to
sites/all/modules/contrib/devel.
Project devel contains 3 modules:
devel_generate, devel, devel_node_access.
$ composer require drupal/devel '7.*'
./composer.json has been updated
Loading composer repositories with package
information
Updating dependencies (including require-dev)
Drush Composer
Drush will select the right module major version, but composer require
must be told which version to use.
Composer require will update the composer.json file before
installing the module.
Pantheon.io / Prometsource.com 32
Install a Module from a Private Repository
{
"repositories": [
{
"type": "vcs",
"url": "https://github.com/your-org/your-module"
}
],
"require": {
"your-org/your-module": "dev-master"
},
…
} https://knpuniversity.com/screencast/question-answer-day/create-composer-package
composer.json
For composer_vendor and drupal-tangler
Pantheon.io / Prometsource.com 33
Add a Patch to a Module
{
"require": {
"netresearch/composer-patches-plugin": "~1.0"
},
"extra": {
"patches": {
"drupal/features": {
"7.2.2":[
{
"title": "Remove mtime from .info export (added by Drupal 7.33)",
"url": "https://www.drupal.org/files/issues/2381739-features-mtime.patch"
}
]
}
}
},
…
} http://cambrico.net/drupal/using-composer-to-build-your-drupal-7-projects
composer.json
For composer_vendor and drupal-tangler
Pantheon.io / Prometsource.com 34
Use a Composer Library from a Module
1.Add a composer.json and require the library
2.There is no step two!
VERY IMPORTANT - Never try to include an autoload.php file from a
plug-in; always leave autoloader management to the application.
Pantheon.io / Prometsource.com 35
Use Composer from a Drush Command
1.Add a composer.json and require the library
2.Call drush_autoload(__FILE__) from your
hook_drush_init().
3.Require your Drush command in the composer.json of the Drupal
site it is used in.
Pantheon.io / Prometsource.com
Tangler works
the same
36
Updating a Site
$ drush pm-update $ composer update
$ drush updatedb
Composer
Remember - regardless of how you update your site, always
do it on a copy first. Never update directly on the
production site!
Drush
Pantheon.io / Prometsource.com
MANAGING YOUR PROJECT
PART
THREE
Pantheon.io / Prometsource.com 38
Manage Project Code
mydrupalsite.org
.git
composer.json
composer.lock
.gitignore
cnf
config.yml.dist
config.yml
modules
htdocs
sites
all
modules
contrib
vendor
Commit composer.json. and composer.lock to the
repository. composer.lock only changes when
you run composer update.
If you have custom modules, you can commit
them in the modules directory.
Avoid committing the htdocs directory, which is
managed by drupal-tangler
With drupal-tangler
Commit config.yml.dist.
Avoid committing config.yml.
Pantheon.io / Prometsource.com 39
Manage Project Code
mydrupalsite.org
.git
composer.json
composer.lock
.gitignore
htdocs
sites
all
modules
custom
contrib
vendor
Commit composer.json. and composer.lock to
the repository. composer.lock only changes
when you run composer update.
If you have custom modules, you can commit
them in the custom directory..
Avoid committing composer-managed
directories, such as
sites/all/modules/contrib and
sites/all/vendor.
With composer_vendor
Pantheon.io / Prometsource.com 40
Deploy Code Using Composer
Local and Remote Dev Environments
install
clone
clone
1
2
3 4
install
Pantheon.io / Prometsource.com 41
Deploy Code Using Rsync
Copy code from dev to stage or live
rsyncinstallclone
1 2 3
Pantheon.io / Prometsource.com 42
Deploy Code Using Two Repositories
Isolate the Provider’s Repository
clone
installclone
commi
t
rsync
pull
Deploy with git while
maintaining a lean working
repository by writing a
short deploy script.
2 3
4
1
5
6
Pantheon.io / Prometsource.com 43
Converting an Existing Site
$ drush dl composer_generate
$ drush @site composer-generate > composer.json
$ composer install
# Set up settings.php, copy files…
$ drush site-install
Pantheon.io / Prometsource.com 44
Creating a New Site
drupal-composer/drupal-project
$ composer create-project drupal-
composer/drupal-project:7.x-dev dir
--stability dev --no-interaction
# Set up settings.php, copy files…
$ drush site-install
Pantheon.io / Prometsource.com 45
Creating a New Site
promet/drupal7-framework
$ composer create-project promet/drupal7-
framework project_name
$ vagrant up --provision
Pantheon.io / Prometsource.com 46
Where Do We Go From Here?
https://groups.drupal.org/composer
http://drupal-composer.org/
https://github.com/drupal-composer
https://getcomposer.org/
@greg_1_anderson
@dsdobrzynski
@general_redneck

More Related Content

PDF
Using Composer with Drupal and Drush
PDF
Drush in the Composer Era
PDF
Drupal 8 - Corso frontend development
PDF
Improving your Drupal 8 development workflow DrupalCampLA
PDF
Ansible project-deploy
PDF
PDF
Ansible Project Deploy (phpbenelux 2015)
PDF
Docman - The swiss army knife for Drupal multisite docroot management and dep...
Using Composer with Drupal and Drush
Drush in the Composer Era
Drupal 8 - Corso frontend development
Improving your Drupal 8 development workflow DrupalCampLA
Ansible project-deploy
Ansible Project Deploy (phpbenelux 2015)
Docman - The swiss army knife for Drupal multisite docroot management and dep...

What's hot (20)

PDF
Configuration as Dependency: Managing Drupal 8 Configuration with git and Com...
PDF
Installation and setup hadoop published
PPT
APACHE
PDF
Perl%20Tutorial.!Picking%20Up%20Perl
PDF
Drupal + composer = new love !?
PDF
Efficient development workflows with composer
PPTX
Drupal in Libraries
PDF
Docker, Ansible and Symfony micro-kernel
PDF
Efficient development workflows with composer
PDF
Advanced Configuration Management with Config Split et al.
PPTX
Virtual Bolt Workshop - 6 May
PDF
Scalable Cloud-Native Masterless Puppet, with PuppetDB and Bolt, Craig Watson...
PDF
Modulesync- How vox pupuli manages 133 modules, Tim Meusel
PPTX
DevOps hackathon Session 2: Basics of Chef
PDF
Virtual Bolt Workshop, 5 May 2020
PPTX
Easily Manage Patching and Application Updates with Chocolatey + Puppet - Apr...
PDF
Composer is the new Drush - Drupal Developer Training (internal)
PPTX
Getting Started With Aura
PDF
How to deploy PHP projects with docker
PDF
Practical PHP Deployment with Jenkins
Configuration as Dependency: Managing Drupal 8 Configuration with git and Com...
Installation and setup hadoop published
APACHE
Perl%20Tutorial.!Picking%20Up%20Perl
Drupal + composer = new love !?
Efficient development workflows with composer
Drupal in Libraries
Docker, Ansible and Symfony micro-kernel
Efficient development workflows with composer
Advanced Configuration Management with Config Split et al.
Virtual Bolt Workshop - 6 May
Scalable Cloud-Native Masterless Puppet, with PuppetDB and Bolt, Craig Watson...
Modulesync- How vox pupuli manages 133 modules, Tim Meusel
DevOps hackathon Session 2: Basics of Chef
Virtual Bolt Workshop, 5 May 2020
Easily Manage Patching and Application Updates with Chocolatey + Puppet - Apr...
Composer is the new Drush - Drupal Developer Training (internal)
Getting Started With Aura
How to deploy PHP projects with docker
Practical PHP Deployment with Jenkins
Ad

Viewers also liked (17)

PPT
Drush and drupal. администрирование. Волчек Михаил
PDF
[Srijan Wednesday Webinar] Mastering Drupal 8 Development with Drupal Console
PPTX
Drupal, Memcache and Solr on Windows
PPTX
Managing Drupal on Windows with Drush
PDF
Getting started with Drupal 8
PPTX
Drupal 6 to Drupal 8 Migration
PDF
Drush workshop
PDF
Drush for humans - SANDcamp 2013
PDF
Drush installation guide
ODP
Drush Presentation
PDF
Composer Tools & Frameworks for Drupal
PDF
Xdebug and Drupal8 tests (PhpUnit and Simpletest)
KEY
Depolying Drupal with Git, Drush Make and Capistrano
PDF
Drush - use full power - DrupalCamp Donetsk 2014
PPTX
Automation testing with Drupal 8
PDF
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
PPT
5 Important Tools for Drupal Development
Drush and drupal. администрирование. Волчек Михаил
[Srijan Wednesday Webinar] Mastering Drupal 8 Development with Drupal Console
Drupal, Memcache and Solr on Windows
Managing Drupal on Windows with Drush
Getting started with Drupal 8
Drupal 6 to Drupal 8 Migration
Drush workshop
Drush for humans - SANDcamp 2013
Drush installation guide
Drush Presentation
Composer Tools & Frameworks for Drupal
Xdebug and Drupal8 tests (PhpUnit and Simpletest)
Depolying Drupal with Git, Drush Make and Capistrano
Drush - use full power - DrupalCamp Donetsk 2014
Automation testing with Drupal 8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
5 Important Tools for Drupal Development
Ad

Similar to Composer tools and frameworks for drupal.ppt (20)

PDF
Lean Drupal Repositories with Composer and Drush
PDF
Guzzle Drupal 7
PDF
Composer & Drupal
PPTX
Exploring composer in drupal 8 with drupal project - salva molina
PDF
Introduction to Composer for Drupal
PDF
Stop making, start composing - Using Composer for Drupal development
PPTX
Composer JSON kills make files
PDF
Dependency management with Composer
PDF
Create a Symfony Application from a Drupal Perspective
PDF
Drupal 8: Huge wins, a Bigger Community, and why you (and I) will Love it
PDF
Drupal8 for Symfony developers - Dutch PHP
PDF
Recipes for Drupal distributions
PDF
Symfony and Drupal 8
PPT
Future Proofing Your Drupal Skills
PDF
Drupal8 for Symfony Developers (PHP Day Verona 2017)
PPT
Into to drupal8
PDF
Drupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond
PDF
Drupal intro for Symfony developers
PDF
composer_talk_20160209
PDF
[HKDUG] #20161210 - BarCamp Hong Kong 2016 - What's News in PHP?
Lean Drupal Repositories with Composer and Drush
Guzzle Drupal 7
Composer & Drupal
Exploring composer in drupal 8 with drupal project - salva molina
Introduction to Composer for Drupal
Stop making, start composing - Using Composer for Drupal development
Composer JSON kills make files
Dependency management with Composer
Create a Symfony Application from a Drupal Perspective
Drupal 8: Huge wins, a Bigger Community, and why you (and I) will Love it
Drupal8 for Symfony developers - Dutch PHP
Recipes for Drupal distributions
Symfony and Drupal 8
Future Proofing Your Drupal Skills
Drupal8 for Symfony Developers (PHP Day Verona 2017)
Into to drupal8
Drupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond
Drupal intro for Symfony developers
composer_talk_20160209
[HKDUG] #20161210 - BarCamp Hong Kong 2016 - What's News in PHP?

Recently uploaded (20)

PPTX
PptxGenJS_Demo_Chart_20250317130215833.pptx
PPT
tcp ip networks nd ip layering assotred slides
PPTX
presentation_pfe-universite-molay-seltan.pptx
PDF
SASE Traffic Flow - ZTNA Connector-1.pdf
PDF
💰 𝐔𝐊𝐓𝐈 𝐊𝐄𝐌𝐄𝐍𝐀𝐍𝐆𝐀𝐍 𝐊𝐈𝐏𝐄𝐑𝟒𝐃 𝐇𝐀𝐑𝐈 𝐈𝐍𝐈 𝟐𝟎𝟐𝟓 💰
PDF
Sims 4 Historia para lo sims 4 para jugar
PDF
An introduction to the IFRS (ISSB) Stndards.pdf
PPTX
Internet___Basics___Styled_ presentation
PDF
The New Creative Director: How AI Tools for Social Media Content Creation Are...
PDF
Automated vs Manual WooCommerce to Shopify Migration_ Pros & Cons.pdf
PPTX
artificial intelligence overview of it and more
PPTX
June-4-Sermon-Powerpoint.pptx USE THIS FOR YOUR MOTIVATION
PPTX
522797556-Unit-2-Temperature-measurement-1-1.pptx
PDF
Vigrab.top – Online Tool for Downloading and Converting Social Media Videos a...
PPT
Design_with_Watersergyerge45hrbgre4top (1).ppt
PDF
Unit-1 introduction to cyber security discuss about how to secure a system
PPTX
Digital Literacy And Online Safety on internet
PPTX
Introuction about WHO-FIC in ICD-10.pptx
PPTX
QR Codes Qr codecodecodecodecocodedecodecode
PPTX
Slides PPTX World Game (s) Eco Economic Epochs.pptx
PptxGenJS_Demo_Chart_20250317130215833.pptx
tcp ip networks nd ip layering assotred slides
presentation_pfe-universite-molay-seltan.pptx
SASE Traffic Flow - ZTNA Connector-1.pdf
💰 𝐔𝐊𝐓𝐈 𝐊𝐄𝐌𝐄𝐍𝐀𝐍𝐆𝐀𝐍 𝐊𝐈𝐏𝐄𝐑𝟒𝐃 𝐇𝐀𝐑𝐈 𝐈𝐍𝐈 𝟐𝟎𝟐𝟓 💰
Sims 4 Historia para lo sims 4 para jugar
An introduction to the IFRS (ISSB) Stndards.pdf
Internet___Basics___Styled_ presentation
The New Creative Director: How AI Tools for Social Media Content Creation Are...
Automated vs Manual WooCommerce to Shopify Migration_ Pros & Cons.pdf
artificial intelligence overview of it and more
June-4-Sermon-Powerpoint.pptx USE THIS FOR YOUR MOTIVATION
522797556-Unit-2-Temperature-measurement-1-1.pptx
Vigrab.top – Online Tool for Downloading and Converting Social Media Videos a...
Design_with_Watersergyerge45hrbgre4top (1).ppt
Unit-1 introduction to cyber security discuss about how to secure a system
Digital Literacy And Online Safety on internet
Introuction about WHO-FIC in ICD-10.pptx
QR Codes Qr codecodecodecodecocodedecodecode
Slides PPTX World Game (s) Eco Economic Epochs.pptx

Composer tools and frameworks for drupal.ppt

  • 1. Pantheon.io / Prometsource.com JULY 22-24, 2015 NATIONAL INSTITUTES OF HEALTH CAMPUS BETHESDA, MD Composer Tools and Frameworks for Drupal
  • 2. Pantheon.io / Prometsource.com Why you should care about composer Today ➢ Dependency Management Hell ➢ Manually Include Classes at runtime ➢ Large unmanagable repository ➢ Composer manages dependencies ➢ Autoloader lazy-includes class files ➢ Repository remains clean and lean With Composer
  • 3. Pantheon.io / Prometsource.com Composer Tools and Frameworks for Drupal + =+ COMPOSER DRUPAL DRUSH WIN
  • 4. Pantheon.io / Prometsource.com 4 Who Are We? Greg Anderson Doug Dobrzynski
  • 5. Pantheon.io / Prometsource.com 5 Who Are We? Allan Chappell Senior Solutions Architect
  • 6. Pantheon.io / Prometsource.com 6 Agenda ‣What is Composer? ‣Installing Drupal 7 with Composer •composer_vendor + custom-installer •drupal-tangler ‣Managing Your Project
  • 7. Pantheon.io / Prometsource.com WHAT IS COMPOSER? PART ONE
  • 8. Pantheon.io / Prometsource.com 8 What Is Composer? An Installer A Dependency Manager An Autoloader { "require": { "php": ">=5.4.0", "symfony/browser-kit": "~2.1", "symfony/css-selector": "~2.1", "symfony/dom-crawler": "~2.1", "guzzlehttp/guzzle": ">=4,<6" }, … } Evaluate and select <?php $client = new GuzzleHttpClient(); >=4,<6 guzzlehttp/guzzle 5.* guzzlehttp/guzzle v5.2.0 guzzlehttp/guzzle "autoload": { "psr-4": { "GuzzleHttp": "src/" } }, composer.json
  • 9. Pantheon.io / Prometsource.com 9 Why Use Composer? ‣Standard ‣Easiest for developers •Dependency resolution •Code updates •Autoloading of classes ‣Composer is being adopted everywhere
  • 10. Pantheon.io / Prometsource.com 1 What Projects Are Using Composer? Not Using Composer … and many others! http/guzzle fabpot/goutteDrupal Modules Drush Extensions PHP APIs symfony/yaml twig/twig Not Using ComposerUsing Composer
  • 11. Pantheon.io / Prometsource.com 11 Drupal 7 and Composer Can we do this? ?+ =
  • 12. Pantheon.io / Prometsource.com 12 Composer Parts of the Whole Composer PHP dependency management software. Packagist A software repository manager. Custom Installer An executable Composer component. Optional. autoload.php A generated file that must be included by your app. composer.json A structured file that defines a project.
  • 13. Pantheon.io / Prometsource.com 13 Repository Data for Drupal Projects packagist.drupal-composer.org A third-party repository containing data on projects from drupal.org.
  • 14. Pantheon.io / Prometsource.com 14 Semantic Versioning Drupal Module Version 7.x-1.5 DRUPAL-x.MODULE.MINOR Versions are converted to semantic versioning before being published on packagist.drupal-composer.org. 7.1.5 MAJOR.MINOR.PATCH Composer Version
  • 15. Pantheon.io / Prometsource.com 15 Comparison with Drush Make composer.json Repository and custom installers (previously explained) Drupal module that provides an autoload strategy (next). Drush Make { "name": "organization/project", "description": "Drupal composer.json file", "repositories": [ { "type": "composer", "url": "http://packagist.drupal-composer.org/" } ], "require": { "davidbarratt/custom-installer": "dev-master", "derhasi/composer-preserve-paths": "0.1.*", "drupal/drupal": "7.*", "drupal/composer_vendor": "7.1.*", "http/guzzle": "~5", "drupal/devel": "7.1.*", }, … } ; Drush make file that uses guzzle ; API api = 2 ; Core core = 7.x ; Drupal project. projects[drupal][type] = core projects[drupal][version] = 7.x projects[drupal][download][type] = git projects[drupal][download][branch] = 7.x ; Modules projects[] = composer_manager projects[] = aws_glacier projects[] = devel
  • 16. Pantheon.io / Prometsource.com 16 Autoloading in PHP "autoload": { "psr-4": { "GuzzleHttp": "src/" } }, composer.json from guzzlehttp/guzzle autoload_psr4.php generated by Composer via composer install $vendorDir = dirname(dirname(__FILE__)); return array( 'GuzzleHttp' => array($vendorDir . '/guzzlehttp/guzzle/src'), ); Saves one line of code per class - but it’s a very important line! RUN TIME INSTALL TIME <?php include "vendor/autoload.php"; $client = new GuzzleHTTPClient(); php source file that calls GuzzleHTTP $map = require __DIR__ . '/autoload_psr4.php'; foreach ($map as $namespace => $path) { $loader->setPsr4($namespace, $path); } Composer autoloader registration called from vendor/autoload.php include $vendorDir . '/guzzlehttp/guzzle/src/Client.php';
  • 17. Pantheon.io / Prometsource.com 17 Custom Installers for Composer + D7 generalredneck/drupal-libraries-installer-plugin promet/drupal-tangler derhasi/composer-preserve-paths davidbarratt/custom-installer OR OPTIONAL netresearch/composer-patches-plugin Allows composer.json files to specify where components get installed. Allows nested installation of composer libraries (e. g. Drupal modules inside of Drupal core). Installs modules and themes to their standard location in the vendor directory, and symlinks to them from sites/all/modules/contrib or copies them to sites/all/modules/contrib. Allows composer.json files to specify where components get installed. Allows patch files to be applied to Drupal core or contrib modules after Composer installs them.
  • 18. Pantheon.io / Prometsource.com 18 Adding Composer Support To make this work, we just need to include vendor/autoload.php + =
  • 19. Pantheon.io / Prometsource.com INSTALLING DRUPAL 7 WITH COMPOSER PART TWO
  • 20. Pantheon.io / Prometsource.com Searches for composer.json files in every module and dynamically merges them. 20 Composer Options for Drupal 7 composer_autoload composer_manager Fragile Complex Searches for autoload.php files in every module directory and loads them individually.
  • 21. Pantheon.io / Prometsource.com Writes a settings.php file that loads the correct autoload.php file. Loads the sites/all/vendor/au toload.php file. 21 Better Options for Drupal 7 composer_vendor promet/drupal-tangler Wins! Wins!
  • 22. Pantheon.io / Prometsource.com 22 Directory Structure mydrupalsite.org composer.json composer.lock htdocs sites default settings.php files all modules We create a new top-level directory for our project, because composer cannot manage dependencies in the same directory as composer.json. We will put our Drupal root directory in htdocs. Tangler defaults to www but allows the option to specify a different name. With drupal-tangler
  • 23. Pantheon.io / Prometsource.com 23 Directory Structure mydrupalsite.org vendor drupal views composer htdocs sites default vendor -> ../../../vendor all modules contrib views -> ../../../../../vendor/drupal/views We put the vendor directory in root because that is the default location for the Composer installer. The directory is organized by vendor name. Each contributed module directory is symlinked to the corresponding directory in vendor. With drupal-tangler
  • 24. Pantheon.io / Prometsource.com 24 Directory Structure mydrupalsite.org modules custom feature_modules htdocs sites all modules custom -> ../../../../modules/custom feature_modules -> ../../../../modules/feature_modules We put custom modules in the custom directory in the modules directory in root. The feature_modules directory is symlinked to the feature_modules directory in the modules directory in root. With drupal-tangler We will put our Drupal root directory in htdocs. Tangler defaults to www but allows the option to specify a different name. The custom directory is symlinked to the custom directory in the modules directory in root.
  • 25. Pantheon.io / Prometsource.com 25 Directory Structure mydrupalsite.org cnf config.yml.dist config.yml htdocs sites default settings.php We put default configuration for settings in config.yml.dist. We put default configuration for settings in config.yml.dist. The settings.php file is generated by settings_compile from config.yml. If config. yml does not exist, it is generated from config. yml.dist. With drupal-tangler
  • 26. Pantheon.io / Prometsource.com 26 Use Installation Profiles mydrupalsite.org vendor drupal panopoly htdocs profiles panopoly -> ../../vendor/drupal/panopoly Composer downloads the profile to the drupal directory in the vendor directory. The panopoly directory is symlinked to the panopoly directory in the vendor directory. With drupal-tangler
  • 27. Pantheon.io / Prometsource.com 27 Directory Structure mydrupalsite.org composer.json composer.lock htdocs sites default settings.php files all modules vendor We create a new top-level directory for our project, because composer cannot manage dependencies in the same directory as composer.json. We will put our Drupal root directory in htdocs. We put the vendor directory in sites/all/vendor because that is where the composer_vendor project expects to find it. With composer_vendor
  • 28. Pantheon.io / Prometsource.com 28 Place the Vendor Directory composer.json { "require": { … }, "config": { "vendor-dir": "htdocs/sites/all/vendor" }, … } For composer_vendor with a custom-installer
  • 29. Pantheon.io / Prometsource.com 29 Place Modules and Themes { "require": { "davidbarratt/custom-installer": "dev-master", … }, "extra": { "custom-installer": { "drupal-module": "htdocs/sites/all/modules/contrib/{$name}/", "drupal-theme": "htdocs/sites/all/themes/contrib/{$name}/" }, }, … } composer.json For composer_vendor with a custom-installer
  • 30. Pantheon.io / Prometsource.com 30 Use Installation Profiles { "require": { "davidbarratt/custom-installer": "dev-master", "drupal/panopoly": "7.1.*", … }, "extra": { "custom-installer": { "drupal-profile": "htdocs/profiles/{$name}/" }, }, … } composer_vendor composer.json For composer_vendor with a custom-installer
  • 31. Pantheon.io / Prometsource.com 31 Downloading Modules $ drush dl devel Project devel (7.x-1.5) downloaded to sites/all/modules/contrib/devel. Project devel contains 3 modules: devel_generate, devel, devel_node_access. $ composer require drupal/devel '7.*' ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) Drush Composer Drush will select the right module major version, but composer require must be told which version to use. Composer require will update the composer.json file before installing the module.
  • 32. Pantheon.io / Prometsource.com 32 Install a Module from a Private Repository { "repositories": [ { "type": "vcs", "url": "https://github.com/your-org/your-module" } ], "require": { "your-org/your-module": "dev-master" }, … } https://knpuniversity.com/screencast/question-answer-day/create-composer-package composer.json For composer_vendor and drupal-tangler
  • 33. Pantheon.io / Prometsource.com 33 Add a Patch to a Module { "require": { "netresearch/composer-patches-plugin": "~1.0" }, "extra": { "patches": { "drupal/features": { "7.2.2":[ { "title": "Remove mtime from .info export (added by Drupal 7.33)", "url": "https://www.drupal.org/files/issues/2381739-features-mtime.patch" } ] } } }, … } http://cambrico.net/drupal/using-composer-to-build-your-drupal-7-projects composer.json For composer_vendor and drupal-tangler
  • 34. Pantheon.io / Prometsource.com 34 Use a Composer Library from a Module 1.Add a composer.json and require the library 2.There is no step two! VERY IMPORTANT - Never try to include an autoload.php file from a plug-in; always leave autoloader management to the application.
  • 35. Pantheon.io / Prometsource.com 35 Use Composer from a Drush Command 1.Add a composer.json and require the library 2.Call drush_autoload(__FILE__) from your hook_drush_init(). 3.Require your Drush command in the composer.json of the Drupal site it is used in.
  • 36. Pantheon.io / Prometsource.com Tangler works the same 36 Updating a Site $ drush pm-update $ composer update $ drush updatedb Composer Remember - regardless of how you update your site, always do it on a copy first. Never update directly on the production site! Drush
  • 37. Pantheon.io / Prometsource.com MANAGING YOUR PROJECT PART THREE
  • 38. Pantheon.io / Prometsource.com 38 Manage Project Code mydrupalsite.org .git composer.json composer.lock .gitignore cnf config.yml.dist config.yml modules htdocs sites all modules contrib vendor Commit composer.json. and composer.lock to the repository. composer.lock only changes when you run composer update. If you have custom modules, you can commit them in the modules directory. Avoid committing the htdocs directory, which is managed by drupal-tangler With drupal-tangler Commit config.yml.dist. Avoid committing config.yml.
  • 39. Pantheon.io / Prometsource.com 39 Manage Project Code mydrupalsite.org .git composer.json composer.lock .gitignore htdocs sites all modules custom contrib vendor Commit composer.json. and composer.lock to the repository. composer.lock only changes when you run composer update. If you have custom modules, you can commit them in the custom directory.. Avoid committing composer-managed directories, such as sites/all/modules/contrib and sites/all/vendor. With composer_vendor
  • 40. Pantheon.io / Prometsource.com 40 Deploy Code Using Composer Local and Remote Dev Environments install clone clone 1 2 3 4 install
  • 41. Pantheon.io / Prometsource.com 41 Deploy Code Using Rsync Copy code from dev to stage or live rsyncinstallclone 1 2 3
  • 42. Pantheon.io / Prometsource.com 42 Deploy Code Using Two Repositories Isolate the Provider’s Repository clone installclone commi t rsync pull Deploy with git while maintaining a lean working repository by writing a short deploy script. 2 3 4 1 5 6
  • 43. Pantheon.io / Prometsource.com 43 Converting an Existing Site $ drush dl composer_generate $ drush @site composer-generate > composer.json $ composer install # Set up settings.php, copy files… $ drush site-install
  • 44. Pantheon.io / Prometsource.com 44 Creating a New Site drupal-composer/drupal-project $ composer create-project drupal- composer/drupal-project:7.x-dev dir --stability dev --no-interaction # Set up settings.php, copy files… $ drush site-install
  • 45. Pantheon.io / Prometsource.com 45 Creating a New Site promet/drupal7-framework $ composer create-project promet/drupal7- framework project_name $ vagrant up --provision
  • 46. Pantheon.io / Prometsource.com 46 Where Do We Go From Here? https://groups.drupal.org/composer http://drupal-composer.org/ https://github.com/drupal-composer https://getcomposer.org/ @greg_1_anderson @dsdobrzynski @general_redneck