Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo

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

More Related Content

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