composer (php usergroup karlsruhe)
TRANSCRIPT
Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org
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
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
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
Composer Goals
Ease of UseProject Dependencies - No globallyinstalled packagesFlexibility/Customizability
Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org
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
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
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
Demo: packagist.org
Nils Adermann github.com/composerTwitter @naderman packagist.org & getcomposer.org
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
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
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
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
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
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
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
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
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
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
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
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
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