composer & drupal

26
Composer & Drupal Drupal Meetup Stuttgart 04.02.2016

Upload: drubb

Post on 11-Feb-2017

577 views

Category:

Internet


0 download

TRANSCRIPT

Page 1: Composer & Drupal

Composer & Drupal

Drupal Meetup Stuttgart04.02.2016

Page 2: Composer & Drupal

Composer is a...

● Dependency Manager for PHP projects-> Requirements like frameworks or libraries

● Package Manager for PHP packages-> Globally installed tools, like Drush or Console

http://getcomposer.org

Page 3: Composer & Drupal

Why should we care?

● Avoiding dependency hell● Getting off the island● Don’t reinvent the wheel● Proudly invented / found elsewhere (PIE)● Everyone does it● ~85.000 packages for PHP projects using Composer (2/2016)

Page 4: Composer & Drupal

Basic components

composer.json-> Specifies requirements, sources and configuration

composer.lock-> Lists installed dependencies with current versions

vendor folder-> Dependencies (packages) will be installed here

Autoloader-> Makes dependencies available to your project

Page 5: Composer & Drupal

PHP package repository: http://packagist.org

Page 6: Composer & Drupal

What’s a package?

Package =>

● Script● Library● Framework

identified by

"vendor/package name", e.g. "fabpot/php-cs-fixer"

Page 7: Composer & Drupal

Example

composer require andrioli/hello-composer:"@dev" php:">=5.3.0"

composer.json:

{"require": {

"andrioli/hello-composer": "@dev","php": ">=5.3.0"

}}

index.php:

<?phprequire 'vendor/autoload.php';print HelloWorld\Say::hello();

Composer defaults to stable versions, here we require dev versions, too!

Page 8: Composer & Drupal

Requirement: Semantic versioning

3.6.18

[major].[minor].[patch]

[Breaking].[Feature].[Bugfix]

http://semver.org

Page 9: Composer & Drupal

Specify required versions

[vendor/package]:[version][@[dev|alpha|beta|RC|stable]

Composer supported version constraints:

Exact: 7.1.0 -> Exact versionComparison: >=1.2Range: 1.2 - 1.3Wildcard: 7.1.*Tilde: ~7.1.3 -> Next significant release, >= 7.1.3, < 7.2Carét: ^7.1.0 -> Next major release, >= 7.1.0, < 8.0.0

Page 10: Composer & Drupal

One thing to consider

“just edit your composer.json and add…”

[Seld\JsonLint\ParsingException]

"./composer.json" does not contain valid JSON

Warning: The lock file is not up to date with the latest changes

in composer.json. You may be getting outdated dependencies. Run

update to update them.

=> Use composer commands!

Page 11: Composer & Drupal

Start a new PHP project: composer init

1. Create your index.php: touch index.php

2. Create composer.json: composer init -n

3. Add requirements/dependencies

4. Add the autoloader to your index.php:require 'vendor/autoload.php';

Page 12: Composer & Drupal

Specify requirements: composer require

composer require [ vendor/package ] [ vendor/package ] ...

composer require guzzlehttp/guzzle

composer require phpunit/phpunit --dev

Adds / updates dependencies in composer.json & composer.lock

Package only needed for development? Use --dev !

Page 13: Composer & Drupal

Install requirements: composer install

composer install

composer install --no-dev

Installs exact versions specified in composer.lock

For production environments, use --no-dev !

Page 14: Composer & Drupal

Update requirements: composer update

composer update

composer update [ vendor/package ] [ vendor/package ] ...

Installs the latest version of the specified packagesmeeting the requirements in composer.json

Updates composer.lock accordingly

Page 15: Composer & Drupal

Remove requirements: composer remove

composer remove [ vendor/package ] [ vendor/package ] ...

Removes the specified package(s)

Removes requirements from composer.json

Updates composer.lock accordingly

Page 16: Composer & Drupal

More Composer goodies

● Installs from packagist, various vcs (git, svn, …), pear, zip and more● Applies patches, if needed● Supports scripts, e.g. "post-package-install"● Supports plugins (functional extensions)

Some useful plugins:

composer/installers -> Scaffolding, type-dependent install folderswikimedia/composer-merge-plugin -> merge multiple composer.json filesfxp/composer-asset-plugin -> manage NPM- / Bower packages (CSS/JS)

Page 17: Composer & Drupal

Using composer in Drupal projects

Some pitfalls here:

● Semantic versioning: 7.x-3.5, 8.x-4.0 ?● Different types of packages (modules, themes, libraries)● Different target folders, not just /vendor● Dependencies in .info files● Incompatible project metadata / vcs drupal.org <-> packagist.org

Solutions:

● Specialized package repository, packagist.drupal-composer.org● Use project templates / skeletons!

Page 18: Composer & Drupal

Create a new Drupal project using a template

composer create-project drupal-composer/drupal-project:8.x-dev

myproject --stability dev --no-interaction

composer create-project drupal-composer/drupal-project:7.x-dev

myproject -s dev -n

https://github.com/drupal-composer/drupal-project(just a starting point)

This means the dev version of the template, not of Drupal!

Page 19: Composer & Drupal

It’s not Drupal, it’s best practice!

composer create-project symfony/framework-standard-edition

composer create-project yiisoft/yii2-app-basic

composer create-project laravel/laravel

Use it for scaffolding, profiles, install scripts, configuration, ...

Page 20: Composer & Drupal

Managing Drupal Module & Themes

composer require drupal/devel drupal/views

composer update drupal/linkit

composer remove drupal/webform

Composer takes care of dependencies, so e.g. drupal/views includes drupal/ctools (D7)!

Page 21: Composer & Drupal

What about custom modules?

{

"name": "drubb/myownmodule”,

"description": "Just a little custom module.",

"type": "drubb-custom",

"homepage": "https://github.com/drubb/myownmodule/"

"require": {

"drupal/views": ">=7.3.1"

},

}

Optionally (if not using packagist), use composer-merge plugin to merge your custom composer.json with the main composer.json of your project !

Remember composer-installers?

Page 22: Composer & Drupal

But I use Drush / Console / Bash already?

Great! Keep on using them!

Additionally use them in your Composer scripts!

"post-update-cmd": [

"drush updb","drush cc all","echo Updates completed!"

],

Page 23: Composer & Drupal

UI wanted ? Composer Manager Module!

Page 24: Composer & Drupal

Drush Wrapper: Composer Module!

drush composer require

drush composer install

drush composer update

https://drupal.org/project/composer

Page 25: Composer & Drupal

GIT Workflow

Development

git pullcomposer installcomposer require / updategit push

Add composer.json / composer.lock !Exclude dependencies (/vendor) !

Default for upcoming Drupal 8.1 !

Production

git pull / checkoutcomposer install

Page 26: Composer & Drupal

Read on

Official Composer Documentationhttps://getcomposer.org/doc

Composer the Right Wayhttp://www.slideshare.net/rdohms/composer-the-right-way-phpjhb15

Composer Cheat Sheet for Developershttp://composer.json.jolicode.com

Drupal Composer community initiativehttp://drupal-composer.org

Slides:http://www.slideshare.net/drubb