mastering composer
TRANSCRIPT
Mastering ComposerAdán Lobato
What’s up!
• Soy Adán Lobato
• Soy de Barcelona
• Soy software developer
• Backend Developer en SocialPoint
• Mi twitter es @adanlobato
Agenda
• Minimum stability
• Branch aliases
• Semantic versioning
• Private Repositories
• Installers
• Embedded Composer
• Useful links
Parental Advisory
Minimum stability
Minimum stability, the problem
Minimum stability exposed
Stable!
RC
Beta
Alpha
Dev
“minimum-stability”:
@stable
@rc
@beta
@alpha
@dev
minimum-stability, the global solution
{
"require": {
"php": ">=5.3.3",
"symfony/icu": "~1.0",
"doctrine/common": "~2.2",
"twig/twig": "~1.11",
"psr/log": "~1.0"
},
“minimum-stability”: “dev”
}
@stability flags, the specific solution
{
"require": {
"php": ">=5.3.3",
"symfony/icu": "~1.0",
"doctrine/common": “~2.2@dev",
"twig/twig": "~1.11",
"psr/log": "~1.0"
}
}
@stability flags, recursive stability
{
"require": {
"php": ">=5.3.3",
"symfony/icu": "~1.0",
"doctrine/orm": “~2.2",
"doctrine/dbal": “@dev",
"twig/twig": "~1.11",
"psr/log": "~1.0"
}
}
prefer-stable, the “magic” solution
{
"require": {
"php": ">=5.3.3",
"symfony/icu": "~1.0",
"doctrine/common": "~2.2",
"twig/twig": "~1.11",
"psr/log": "~1.0"
},
“prefer-stable”: true
}
Branch aliases
Branch aliases, the problem
Branch aliases, the bad practice
{
"require": {
“welovephp/foobar”: “dev-master”
}
}
Branch aliases, the solution
{
“name”: “welovephp/foobar”
"extra": {
"branch-alias": {
"dev-master": "2.5-dev"
}
}
}
Branch aliases & stability flags
{
"require": {
“welovephp/foobar”: “2.5.*@dev”
}
}
Branch aliases, inline aliases
{
"require": {
“welovephp/foobar”: “my-branch as 2.5-dev”
}
}
Semantic Versioning
Semantic versioning
X.Y.Z
Semantic versioning
X.Y.Z
Semantic versioning
X.Y.Z
Semantic versioning
X.Y.Z
Semantic versioning
1.*
Semantic versioning
>=1.1,<2.0
Semantic versioning
~1.1
PrivateRepositories
Private Repositories, the basics
{
“repositories”: [
{
“type”: “git”,
“url”: “[email protected]/welovephp/foobar.git”
}
]
}
Private Repositories, the basics
{
“repositories”: [
{ “type”: “git”, “url”: “[email protected]/welovephp/foobar.git” },
{ “type”: “git”, “url”: “[email protected]/welovephp/foobar-bundle.git” },
{ “type”: “git”, “url”: “[email protected]/welovephp/fizz.git” },
{ “type”: “git”, “url”: “[email protected]/welovephp/buzz.git” },
{ “type”: “git”, “url”: “[email protected]/welovephp/fizzbuzz-bundle.git” },
{ “type”: “git”, “url”: “[email protected]/welovephp/qwerty.git” },
{ “type”: “git”, “url”: “[email protected]/welovephp/doe.git” }
]
}
Private Repositories, the basics
Private Repositories, the basics
Private Repositories:Satis
Private Repositories, Satis
$ composer create-project composer/satis
Private Repositories, Satis
// config.json
{
"name": "WelovePhp",
"homepage": "http://packages.welovephp.es",
"require-all": true,
“repositories”: [
{ “type”: “git”, “url”: “[email protected]/welovephp/foobar.git” },
{ “type”: “git”, “url”: “[email protected]/welovephp/foobar-bundle.git” },
{ “type”: “git”, “url”: “[email protected]/welovephp/fizz.git” },
{ “type”: “git”, “url”: “[email protected]/welovephp/buzz.git” },
{ “type”: “git”, “url”: “[email protected]/welovephp/fizzbuzz-bundle.git” },
{ “type”: “git”, “url”: “[email protected]/welovephp/qwerty.git” }
]
}
Private Repositories, Satis
$ php bin/satis build config.json web/
Private Repositories, Satis
Private Repositories, Satis
{
"repositories": [
{
"type": "composer",
"url": “http://packages.welovephp.es/“
}
]
}
Private Repositories, Satis
Security:
• Basic HTTP Authentication
• SSH
• Private network
!
Updates
• CRON job
Private Repositories:Packagist
Private Repositories, Packagist
• Packagist is an Open Source project
• It is built as a Symfony application
• You can have your own private Packagist
• Supports Github Webhooks
Private Repositories, Packagist
Requirements:
• MySQL
• Redis
• Solr
• git / svn / hg
Private Repositories:Bottlenecks
Private Repositories, the bottlenecks
Installers
Installers, the official ones
• Wordpress
• Drupal
• CakePHP
• CodeIgniter
• Laravel
• Tons more!
http://github.com/composer/installers
Installers, building your own installer
{
"name": "welovephp/blog-module",
"type": “welovephp-module",
"require": {
“welovephp/module-installer-plugin“: "*"
}
}
Installers, building your own installer
{
"name": “welovephp/module-installer-plugin",
"type": "composer-plugin",
"autoload": {
"psr-0": {"WeLovePhp\\Composer": "src/"}
},
"extra": {
"class": "WeLovePhp\\Composer\\ModuleInstallerPlugin"
},
"require": { "composer-plugin-api": “1.0.0" }
}
Installers, building your own installer
namespace WeLovePhp\Composer;
class ModuleInstallerPlugin implements PluginInterface
{
public function activate(Composer $composer, IOInterface $io)
{
$installer = new ModuleInstaller($io, $composer);
$composer->getInstallationManager()->addInstaller($installer);
}
}
Installers, building your own installer
namespace phpDocumentor\Composer;
!class ModuleInstaller extends LibraryInstaller
{
public function getPackageBasePath(PackageInterface $package)
{
return 'welovephp/modules/'.$package->getPrettyName();
}
! public function supports($packageType)
{
return ‘welovephp-module' === $packageType;
}
}
Embedded Composer
By Beau Simensen
Embedded Composer, the problem
• You have an application
• Your application has dependencies
• Your application can be extended via third-party plugins
• Those plugins depend on your app, but can have other extra dependencies
• Both, app & plugins dependencies, must be installed once and be compatible between them
Embedded Composer, the solution
We need to be able to run Composer on runtime
Embedded Composer & Sculpin.io
Commands you must know
diagnose
$ composer diagnose
Checks common errors to help debugging problems.
—verbose
$ composer command […] -v|vv|vvv
Increase output verbosity. Useful for debugging.
config —global
$ composer config —global […]
Read/Write Composer global settings.
global
$ composer global require phpunit/phpunit
Add COMPOSER_HOME/vendor/bin to PATH
!
Run Composer operations globally. Useful for CLI tools.
status
$ composer status
Displays a list of dependencies that have been modified locally.
show
$ composer show package/name
Displays detailed information about a package.
dump-autoload —optimize
$ composer dump-autoload —optimize
Dumps a classmap for PSR-0 vendors.
Useful links
Useful links
Composer
• http://getcomposer.org/doc/
• https://github.com/composer/composer
• https://packagist.org/
• #composerphp at twitter
!
Composer Basics
• http://www.slideshare.net/adanlobato/composer-gestor-de-dependencias-para-php
• http://www.youtube.com/watch?v=U1dTiDlUUmU
• http://adanlobato.github.io/composer-2013
Useful links
Minimum stability
• http://getcomposer.org/doc/04-schema.md#minimum-stability
• http://getcomposer.org/doc/04-schema.md#package-links
• https://igor.io/2013/02/07/composer-stability-flags.html
!
Branch alias
• http://getcomposer.org/doc/articles/aliases.md
• https://igor.io/2013/01/07/composer-versioning.html
!
Semantic versioning
• http://semver.org/
Useful links
Private Repositories
• https://github.com/composer/satis
• https://github.com/composer/packagist
• https://help.github.com/articles/post-receive-hooks
!
Installers
• http://getcomposer.org/doc/articles/custom-installers.md
• https://github.com/composer/installers
!
Useful links
Embedded Composer
• https://speakerdeck.com/simensen/embedded-composer-sflive-portland-2013
• https://github.com/dflydev/dflydev-embedded-composer
• https://github.com/sculpin
!
That’s all folks!Questions?