Composer (PHP Usergroup Karlsruhe)

22
Nils Adermann github.com/composer Twitter @naderman packagist.org & getcomposer.org

Transcript of Composer (PHP Usergroup Karlsruhe)

Page 1: Composer (PHP Usergroup Karlsruhe)

Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org

Page 2: Composer (PHP Usergroup Karlsruhe)

Using a Composed Project (I)git clone https://github.com/igorw/trashbinCloning into trashbin...cd trashbin/curl -s http://getcomposer.org/installer | phpAll settings correct for using Composer

Composer successfully installed to:/home/naderman/projects/composer/demo/phpugka/composer.pharUse it: php composer.phar

Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org

Page 3: Composer (PHP Usergroup Karlsruhe)

Using a Composed Project (II)php composer.phar installInstalling from lock file- Package symfony/class-loader (2.1.0-dev)DownloadingUnpacking archiveCleaning up

[...]

- Package predis/predis (master-dev)DownloadingUnpacking archiveCleaning up

- Package twig/twig (1.6.0-dev)DownloadingUnpacking archiveCleaning up

Generating autoload files

Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org

Page 4: Composer (PHP Usergroup Karlsruhe)

Using a Composed Project (III)vendor/ .composer/ bin/ pimple/ pimple/ predis/ predis/ service-provider/ silex/ silex/ symfony/ browser-kit/ class-loader/ css-selector/ dom-crawler/ event-dispatcher/ finder/ http-foundation/ http-kernel/ routing/ twig/ twig/

Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org

Page 5: Composer (PHP Usergroup Karlsruhe)

Composer Goals

Ease of UseProject Dependencies - No globallyinstalled packagesFlexibility/Customizability

Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org

Page 6: Composer (PHP Usergroup Karlsruhe)

The Basics: Defining Dependencies

composer.jsonLocated in project root directoryDefines dependencies

{ "require": { "silex/silex": ">=1.0.0-dev", "symfony/finder": ">=2.1-dev", "twig/twig": ">=1.4", "predis/service-provider": "master-dev" }}

Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org

Page 7: Composer (PHP Usergroup Karlsruhe)

The Basics: Package Metadata

{ "name": "predis/predis", "type": "library", "description": "Flexible and feature-complete PHP client library for Redis", "keywords": ["nosql", "redis", "predis"], "homepage": "http://github.com/nrk/predis", "license": "MIT", "version": "0.7.1" "authors": [ { "name": "Daniele Alessandri", "email": "[email protected]", "homepage": "http://clorophilla.net" } ], "require": { "php": ">=5.3.0" }, "autoload": { "psr-0": {"Predis": "lib/"} }}

Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org

Page 8: Composer (PHP Usergroup Karlsruhe)

Packagist

Central composer package repository

Open to packages from anyone

GitHub Integration: Packages from tags & branches

Browse & Search Packages

Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org

Page 9: Composer (PHP Usergroup Karlsruhe)

Demo: packagist.org

Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org

Page 10: Composer (PHP Usergroup Karlsruhe)

composer.lock (I)

List of packages & versions

If available, composer install uses composer.lockinstead of composer.json

Created by composer installUpdated by composer update

Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org

Page 11: Composer (PHP Usergroup Karlsruhe)

composer.lock (II)

Commit composer.lock in your VCS and ship it withyour releases

Everyone on a team works with exactly the samedependency versionsWhen deploying, all machines run exactly the samedependency versionsUsers will never get dependency versions that you didnot test with

Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org

Page 12: Composer (PHP Usergroup Karlsruhe)

Development InstallationAllows you to commit changes to projects in vendor/php composer.phar install --devInstalling from lock file

[...]

- Package predis/service-provider (master-dev)Cloning v0.2.3

- Package pimple/pimple (1.0.0-dev)Cloning 321db91e49b6cf8cbeed58d8db662d40de96d2c3

- Package predis/predis (master-dev)Cloning v0.7.1

- Package twig/twig (1.6.0-dev)Cloning 8256bfa05c1604bf24d8c0d1627822b4fa503e2f

Generating autoload files

Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org

Page 13: Composer (PHP Usergroup Karlsruhe)

Autoloading"autoload": { "psr-0": {"Predis": "lib/"}}vendor/.composer/ autoload_namespaces.php autoload.php ClassLoader.php installed.jsonTrashbin uses the generated autoloaderrequire_once __DIR__.'/../vendor/.composer/autoload.php';use Silex\Application;use Silex\Extension\TwigExtension;use Symfony\Component\Finder\Finder;use Symfony\Component\HttpFoundation\Response;$app = new Application();

Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org

Page 14: Composer (PHP Usergroup Karlsruhe)

Custom Repositories"repositories": { "my-repo": { "composer": { "url": "http://example.org" } }, "MyRepo": { "vcs": { "url": "git://example.org/MyRepo.git" } }, "example org": { "pear": { "url": "http://pear.example.org" } }, "packagist": false}Composer Repository Implementations (packages.json)

PackagistSatis

Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org

Page 15: Composer (PHP Usergroup Karlsruhe)

Depending on packages without composer.json"repositories": { "some vendor repo": { "package": { "name": "vendor/package", "version": "1.0.0", "dist": { "url": "http://example.org/package.zip", "type": "zip" }, "source": { "url": "git://example.org/package.git", "type": "git", "reference": "tag name, branch name or commit hash" } } }},"require": { "vendor/package": "1.0.0"}

Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org

Page 16: Composer (PHP Usergroup Karlsruhe)

Other Dependency Types: Replace

Useful if a patch is not available in upstream

"name": "myvendor/predis","replace": { "predis/predis": "0.7.*"}Trashbin depends on predis/service-provider whichdepends on predis/predisphp composer.phar updatemyvendor/predis is installed instead of predis/predis

Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org

Page 17: Composer (PHP Usergroup Karlsruhe)

Other Dependency Types: Provide

my/cache is a virtual package, it does not exist

"name": "my/library","require": { "my/cache": "1.0.0"}"name": "my/apc-store","provide": { "my/cache": "1.0.0"}"name": "my/memcache-store","provide": { "my/cache": "1.0.0"}Installing my/library will install either my/apc-store ormy/memcache-store

If you require another package providing my/cache,neither will be installed

Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org

Page 18: Composer (PHP Usergroup Karlsruhe)

Other Dependency Types

ConflictIf vendor/a conflicts with vendor/b, they cannot be bothinstalled

RecommendIf vendor/a recommends vendor/b, it will be installedunless you specify --no-install-recommendsSuggestIf vendor/a suggests vendor/b, it will only be installed ifyou specify --install-suggests

Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org

Page 19: Composer (PHP Usergroup Karlsruhe)

Dependency Resolution with SATAll packages in all repositories are collected in a package pool

Dependencies between all packages are turned into boolean rules:

install B (version 1 or 2)(B1|B2)A requires B (version 1 or 2):(-A|B1|B2)A conflicts with B (version 1 and 2):(-A|-B1), (-A|-B2)C and D provide E:(-E|C|D)B2 updates/obsoletes B1(-B1|-B2)

Example(-A|B1|B2) (-B2|C) (A) (-B1|-B2) (-A|-C)Now use a SAT solver to find boolean values for A, B1, B2, C so that all rules are trueA, B1, -B2, -CIf a variable is true, it will be installed

Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org

Page 20: Composer (PHP Usergroup Karlsruhe)

Composer Repositories vs.PEAR Channels

Repositories allow easy proxying of packages:

Proxy only reviewed open source packages to a companyrepositoryEasily aggregate all open source packages on a centralrepository

PEAR requires explicit referencing of a channel whendefining dependencies:

Replacing a single package with your own in a chain ofdependencies is impossible

Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org

Page 21: Composer (PHP Usergroup Karlsruhe)

Composer as a reusable libraryPhar distribution with composer-installableplugins (Beau Simensen)phpBB4: Web UI for Plugin Management

Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org

Page 22: Composer (PHP Usergroup Karlsruhe)

Thank you!Learn more & contribute

packagist.org/about-composerpackagist.org/about

github.com/composergroups.google.com/forum/#!forum/composer-dev

Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org