+ All Categories
Home > Internet > Efficient development workflows with composer

Efficient development workflows with composer

Date post: 18-Jan-2017
Category:
Upload: nuppla
View: 527 times
Download: 2 times
Share this document with a friend
66
Efficient development workflows with Composer
Transcript
Page 1: Efficient development workflows with composer

Efficient development workflows

with Composer

Page 2: Efficient development workflows with composer

About me

● Wolfgang Ziegler● drupal.org/u/fago● @the_real_fago at

twitter

Page 3: Efficient development workflows with composer

Wolfgang Ziegler // fago

● More than 10 years of Drupal experience● Leading force behind the Drupal 8 Entity

Field API improvementsMaintainer of Typed Data API

● Creator of Rules, Field Collection, Profile2

Page 4: Efficient development workflows with composer

CEO/CTO of

Page 5: Efficient development workflows with composer

http://getcomposer.org

Page 6: Efficient development workflows with composer

What is it?● Dependency manager for PHP● Use and publish packages● Package-metadata:

composer.json● Repository: packagist.org

Page 7: Efficient development workflows with composer

composer.json{

"name": "drupal/core",

"description": "Drupal is an open source content management....",

"require": {

  "twig/twig": "1.15.*",

  "symfony/class­loader": "2.5.*",

Page 8: Efficient development workflows with composer

Using a package

composer require guzzle/guzzle 

Page 9: Efficient development workflows with composer

Providing a package● Add composer.json● Tag releases Semantic →

versioning● Add Git repository to packagist.org

Page 10: Efficient development workflows with composer

Packagist

Page 11: Efficient development workflows with composer

Using it in project

● Add composer .json● Specify

● Add dependencies"type": "project"

Page 12: Efficient development workflows with composer

Using it in a project

git clone ­­branch 8.1.x https://git.drupal.org/project/drupal.git

cd drupal

composer install

Page 13: Efficient development workflows with composer

What happens?

● Reads composer.lock and installs recorded versions

● Downloads code and puts it into ./vendor (or somewhere else)

● Generates a class autoloader

Page 14: Efficient development workflows with composer

Composer update & locks● composer update

– Update all the dependencies and write new lock file

● composer install 

– Apply what's recorded in the lock file

Page 15: Efficient development workflows with composer

Composer & VCS● Commit composer.json● For projects: Commit

composer.lock● For libraries: Commit

composer.lock for tests● Avoid commit vendor files

Page 16: Efficient development workflows with composer

Versions & Composer

● Require versions like 2.1.*● composer supports many different

version constraints● Specify allowed versions, not

specific versions

Page 17: Efficient development workflows with composer

Composer & Drupal Projects

Page 18: Efficient development workflows with composer

Bye, bye, drush make!

● composer replaces drush make● Support for Drupal modules via:

– https://packagist.drupal­composer.org

– https://packages.drupal.org/7

– https://packages.drupal.org/8

Page 19: Efficient development workflows with composer

Project template

http://github.com/drupal-composer/drupal-project

Page 20: Efficient development workflows with composer

Start a new d8 project

composer create­project drupal­composer/drupal­project

Page 21: Efficient development workflows with composer

What does it do?● Adds Drupal into the „web“ dir● Adds folder structure, drush, Drupal

console, …● Custom projects can add more stuff

and/or customize things– Add Drupal modules & themes!

Page 22: Efficient development workflows with composer

Drupal modules & ./vendor?● Composer package types:

– library

– project

– drupal­module

– drupal­theme

– drupal­profile

– drupal­drush

Page 23: Efficient development workflows with composer

Working with a composer-based Drupal

project

Page 24: Efficient development workflows with composer

composer install all the way!● Do not forget to run composer

install!● After pulling changes, run it!● Best: Add to deployment alias:

composer install && drush updatedb && ...

Page 25: Efficient development workflows with composer

Adding a module

composer require drupal/MODULEcomposer require drupal/MODULE=1.*composer require drupal/MODULE=1.*@beta composer require drupal/MODULE=1.*@dev

Downloads the module + updates files!

Page 26: Efficient development workflows with composer

Keep things ordered

 "config": {   "sort­packages": true, },

Page 27: Efficient development workflows with composer

Update your modules

● composer update● Commit the changes in

composer.lock !

Page 28: Efficient development workflows with composer

Update a single module

composer update drupal/module

composer update drupal/module  ­­with­depdendencies

Page 29: Efficient development workflows with composer

Checking installed versions● List all packages:composer show

● List directly added pagckages only:composer show ­D

Page 30: Efficient development workflows with composer

Where did it go?

composer show ­P

Page 31: Efficient development workflows with composer

Patches● cweagans/composer-patches

"extra": {  "patches": {    "drupal/foobar": {      "description": "URL to patch"    }  }}

Page 32: Efficient development workflows with composer

Add custom repositoriesWith composer.json:

"require": {  "fago/example": "1.*"}"repositories": [   {    "type": "vcs",    "url": "http://github.com/fago/example"  }]

Page 33: Efficient development workflows with composer

SemVer branching● Branches:

– 1.0.x– 1.1.x– 2.0.x

● Tags / Releases:– 1.0.0– 1.0.1– 1.1.0– 2.0.0

Page 34: Efficient development workflows with composer

Composer versions1.*       =>  1.1.0

^1.0.1    =>  1.1.0 (>=1.0.1, <2)

~1.0      =>  1.1.0 (>=1.0.0, <2)

~1.0.0    =>  1.0.1 (>=1.0.0, <1.1)

1.*@dev   =>  1.1.0 (prefer­stable)

1.*@dev   =>  1.1.0 (prefer­stable)

*         =>  2.0.0

Page 35: Efficient development workflows with composer

Custom repositoriesWithout composer.json:"repositories": [{  "type": "package",  "package": {    "name": "fago/example",    "version": "0.1.0",    "source": {      "url": "github.com/fago/example",      "type": "git",      "reference": "0.1.0"    }  }}]

Page 36: Efficient development workflows with composer

Patches● cweagans/composer-patches

"extra": {  "patches": {    "drupal/foobar": {      "description": "URL to patch"    }  }}

Page 37: Efficient development workflows with composer

Fork & add your fork● Alternative to patch files● Works great with the Github pull

request workflow● composer create­project drupal/module path 2.2.0

● Add in the fork instead upstream

Page 38: Efficient development workflows with composer

Adding in your fork

"require": {  "samson/yt": "dev­BRANCH as 2.0.0"},"repositories": [  {    "type": "vcs",    "url": "https://github.com/fago/yt"  }],

Page 39: Efficient development workflows with composer

Keep builds fast

● composer fetches either „dist“ or „source“ packages

● Prefer „dist“ packages for fast builds & cache use!

● Pre-configured in drupal-project

Page 40: Efficient development workflows with composer

Edit your vendors

rm ­r web/modules/contrib/pathautocomposer install ­­prefer­source

cd web/modules/contrib/pathautogit checkout ­b your­pathauto­branch

Page 41: Efficient development workflows with composer

Merge conflicts?

composer update ­­lock

● „Nice“ hash in composer.lock● Just merge and resolve it by doing

either

Page 42: Efficient development workflows with composer

composer scripts  "scripts": {

    "test": "phpunit web/modules/custom",

    "deploy": "drush updatedb ­y && ...",

  },

    composer deploy  composer test

Page 43: Efficient development workflows with composer

composer scripts

● Uses vendor binaries!● React on events like

– post-package-install– post-create-project-cmd– ..

● Reference other scripts via @script● Handy for documented developer short-cuts

Page 44: Efficient development workflows with composer

Deploying composer managed projects!

Page 45: Efficient development workflows with composer

Avoid committing vendors!● Smaller diffs & pull requests

=> easy to review!● Keeps repositories smaller (only

custom code)● Work with vendor repositories

without submodules

Page 46: Efficient development workflows with composer

Builds & Deployment

1.Hosting takes care of it 2.Deployment tools like capistrano

or deployer (http://deployer.org)3.Git-based deployments of build-

branches or build-repositories

Page 47: Efficient development workflows with composer

Git-based deployments● Common in the Drupal world as it

is required by many Drupal hosters

● I like it :-)

Page 48: Efficient development workflows with composer

Build branches

Never merge build branches back!

master  => build/masterversion/2016­CW47 => build/version/2016­CW47release/2016­CW47 => build/release/2016­CW47

Page 49: Efficient development workflows with composer

Build branches

● We keep them in the same repository

● Enables possible future enhancements

Page 50: Efficient development workflows with composer

Creating builds● PHP-console script for creating

builds● Takes care of updating pre-existing

build branches (think: build/master)● Takes care of tags● Takes care of vendor repositories

Page 51: Efficient development workflows with composer

phapp cli

● Tool for managing PHP applications

● Not yet many commands besides „phapp build“

● https://github.com/ drunomics/phapp­cli

Page 52: Efficient development workflows with composer

phapp build● Custom build scripts via phapp.yml

per project=> Allows adding things like npm

● Just build in place? → phapp build

● Build a branch? → phapp build BRANCH

Page 53: Efficient development workflows with composer

Deployment updates

● Apply changes after code update● Do not rely on special server

environments!

→ More reliable deployments!

Page 54: Efficient development workflows with composer

Deployment script tools● composer scripts● Robo● Drush, Drupal console

Add dependencies to the project!

Page 55: Efficient development workflows with composer

Creating re-usable packages

Page 56: Efficient development workflows with composer

Why?● Develop re-usable PHP libraries,

e.g. REST clients● Feature modules for kick-starting

development

composer require drunomics/dsk_media

Page 57: Efficient development workflows with composer

Add your own packages

● Custom repositories at project● Run your own packagist● Use Toran Proxy● Use satis & static files

– Scans your repositories– Re-run after every change

Page 58: Efficient development workflows with composer

"repositories": [  {    "type": "composer",    "url": "https://satis.example.com"  }],

Page 59: Efficient development workflows with composer

Edit your code● Use source for your packages

"config": {    "preferred­install": {       "drunomics/*": "source",       "*": "dist"    }}

Page 60: Efficient development workflows with composer

Issue:Some modules need libraries

Page 61: Efficient development workflows with composer

Handling libraries & assets● Possible solutions:

– Add them via custom repostories– composer scripts for running bower or

npm on project install– fxp/composer-asset-plugin– ...

Page 62: Efficient development workflows with composer

asset-packagist.org

Page 63: Efficient development workflows with composer

Project configuration"repositories": [{    "type": "composer",    "url": "https://asset­packagist.org"}],"require": { "oomphinc/composer­installers­extender": "*",},"extra": {  "installer­types": ["library"],  "installer­paths": {    "web/libraries/{$name}/": ["vendor:bower­asset", "vendor:npm­asset"]  }}

Page 64: Efficient development workflows with composer

Package

drunomics/dsk_media composer.json:

  "require": {

    "bower­asset/dropzone": "~4.2"  }

Page 65: Efficient development workflows with composer

Usage

composer install

Page 66: Efficient development workflows with composer

Questions?


Recommended