composer
DESCRIPTION
These are the slides of the talk I gave at Trovit on October 2013. It covers from Composer Basics to some more advanced tips and tricks.TRANSCRIPT
ComposerDependency management for PHP
What’s up!
• Soy Adán Lobato
• Soy de Barcelona
• Soy software developer
• Trabajo en SocialPoint
• Mi twitter es @adanlobato
¡Interrumpidme cuando queráis!
2
Agenda
• Composer Basics
• Mastering Composer
• Bottlenecks
• Enlaces de interés
• ¿Preguntas?
3
Composer Basics
¿Qué es Composer?
Es una herramienta que nos permite definir cuáles son las librerías de
las que depende nuestro proyecto y las instala por nosotros.
Jordi Boggiano (@seldaek)
5
¿Es un concepto nuevo?
• En python existe pip
• En javascript existe npm
• En ruby existe bundler
• En php existe… ¿ PEAR / Pyrus ?
6
7
¿Alternativas en PHP?
PEAR Pyrus Composer
Instalación Global Global/Local Global*/Local
Package types Dist Dist Dist/Source
PEAR support Yes Yes Yes
VCS support No No Yes
(*) Only CLI applications
8
Instalación
Instalación
curl -S http://getcomposer.org/installer | php
10
Instalación
$ php composer.phar ______ / ____/___ ____ ___ ____ ____ ________ _____ / / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___// /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ /\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/ /_/Composer version 3da05c68f9561fa822c522b1815435ff990493ff 2013-10-02 14:25:06
Usage: [options] command [arguments]
Available commands: init Creates a basic composer.json file in current directory. install Installs the project dependencies from the composer.lock file... require Adds required packages to your composer.json and installs them search Search for packages self-update Updates composer.phar to the latest version. show Show information about packages status Show a list of locally modified packages update Updates your dependencies to the latest version according to... validate Validates a composer.json
11
Instalación
$ sudo mv composer.phar /usr/local/bin/composer
$ sudo chmod +x /usr/local/bin
$ sudo composer self-update
01.
02.
03.
12
Primeros pasos
Instalando dependencias
$ composer require twig/twig "1.*"
14
Instalando dependencias
2.0.1
15
Instalando dependencias
2.0.*
16
Instalando dependencias
>=2.1,<3.0
17
Instalando dependencias
~2.1
18
Analizando el resultado
$ tree -L 3
├── composer.json
├── composer.lock
└── vendor
├── autoload.php
├── composer
│ ├── ClassLoader.php
│ ├── autoload_classmap.php
│ ├── autoload_namespaces.php
│ ├── autoload_real.php
│ └── installed.json
└── twig
└── twig
19
composer.json
{
"require": {
"twig/twig" : "1.*"
}
}
01.
02.
03.
04.
05.
20
composer.lock
• Si existe, reemplaza a composer.json
• Congela nuestras dependencias a una versión concreta
• Permite que todo el equipo trabaje/testee sobre las mismas versiones
• Imprescindible para deployments
• Debe estar commiteado en el VCS de nuestro proyecto
• Para actualizarlo: composer update
21
Autoloading
<?php
require_once __DIR__.'/vendor/autoload.php';
// Your code
01.
02.
03.
04.
05.
06.
07.
22
Autoloading
<?php
$loader = require_once __DIR__.'/vendor/autoload.php';
$loader->add('My\Namespace', array('src'));
$loader->add('My_Namespace', array('src', 'lib'));
$loader->addClassmap($classmap);
// Your code
01.
02.
03.
04.
05.
06.
07.
23
Repositorios
Packagist
• Repositorio central de paquetes de Composer
• Actúa como proxy entre los repositorios VCS y los usuarios de Composer
• Puede almacenar cualquier tipo de librería PHP: components, bundles,
plugins, módulos…
• Todo proyecto Open Source debería estar en Packagist
• Buen lugar dónde encontrar librerías para tu aplicación
25
VCS: git, svn, hg…{
"repositories": [
{
"type": "vcs",
"url": "https://github.com/symfony/Yaml"
}
],
"require": {
"symfony/yaml": "2.3.*"
}
}
26
PEAR
{
"repositories": [
{
"type": "pear",
"url": "http://pear2.php.net"
}
],
"require": {
"pear-pear2.php.net/PEAR2_Text_Markdown": "*",
"pear-pear2/PEAR2_HTTP_Request": "*"
}
}
27
Repositorios sin composer.json
{ "repositories": [ { "type": "package", "package": { "name": "smarty/smarty", "version": "3.1.7", "dist": { "url": "http://www.smarty.net/files/Smarty-3.1.7.zip", "type": "zip" }, "source": { "url": "http://smarty-php.googlecode.com/svn/", "type": "svn", "reference": "tags/Smarty_3_1_7/distribution/" }, "autoload": { "classmap": ["libs/"] } } } ], "require": { "smarty/smarty": "3.1.*" }}
28
Creando unpaquete
Creando un paquete
{ "name": "trovit/foo", "description": "Super cool library for foo stuff", "homepage": "http://foo.trovit.es", "license": "MIT", "authors": [ { "name": "Trovit backend team", "email": "[email protected]"} ], "autoload": { "psr-0": { "Trovit\\Foo": "src/" } }, "require": { "php": ">=5.3.2", "ext-curl": "*", "symfony/console": "2.3.~" }}
30
Creando un paquete: Autoloading
"autoload": {
"psr-0": {
"Trovit\Foo": "src/"
}
}
01.
02.
03.
04.
05.
31
Creando un paquete: Autoloading
"autoload": {
"psr-0": {
"Trovit_": "src/"
}
}
01.
02.
03.
04.
05.
32
Creando un paquete: Autoloading
"autoload": {
"classmap": ["src/", "lib/"]
}
01.
02.
03.
33
Creando un paquete: Autoloading
"autoload": {
"files": ["src/Trovit/functions.php"]
}
01.
02.
03.
34
Scripts
Scripts
Permiten ejecutar acciones ante determinados eventos de Composer.
• pre|post-install-cmd
• pre|post-update-cmd
• pre|post-package-install
• pre|post-package-update
36
Scripts
{
"scripts": {
"post-install-cmd": [
"My\\Namescape\\ScriptHandler::buildBootstrap"
],
"post-update-cmd": [
"rm -rf app/cache/*"
]
}
}
37
Instaladores
Instaladores oficiales
• Wordpress
• Drupal
• CakePHP
• CodeIgniter
• Laravel
• ¡Y muchos más!
http://github.com/composer/installers
39
Instaladores propios
http://getcomposer.org/doc/articles/custom-installers.md
40
MasteringComposer
Branch aliases
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
}
01.
02.
03.
04.
05.
43
Trabajando con forks
{
"repositories": [
{
"type": "vcs",
"url": "https://github.com/adanlobato/Yaml"
}
],
"require": {
"symfony/yaml": "dev-hotfix"
}
}
44
Trabajando con forks
{
"repositories": [
{
"type": "vcs",
"url": "https://github.com/adanlobato/Yaml"
}
],
"require": {
"symfony/yaml": "dev-hotfix as 1.0.x-dev"
}
}
45
Minimum stability
{
"minimum-stability": "stable",
"require": {
"symfony/config": "2.3",
"symfony/yaml": "2.3.*@dev",
"symfony/console": "2.3.*@beta"
}
}
46
Autoloading optimizado
$ composer dump-autoload --optimize
47
Repositorios privados: Satis
• Es una versión reducida de Packagist
• Se instala y se configura muy rápido
• Es ideal para repositorios privados
48
Repositorios privados: Satis
$ composer create-project composer/satis
49
Repositorios privados: Satis
// config.json
{
"name": "Trovit Repository",
"homepage": "http://packages.trovit.es",
"require-all": true,
"repositories": [
{
"type": "git",
"url": "https://github.com/trovit/super-cool-library"
}
]
}
50
Repositorios privados: Satis
$ php bin/satis build config.json web/
51
Repositorios privados: Satis
Para protegerlo del exterior:
• Basic HTTP Authentication
• SSH
• Red privada
52
Repositorios privados: Packagist
• Packagist es Open Source
• Puedes instalarte tu propio packagist
• Soporta Github Webhooks
53
Bottlenecks
Bottlenecks
• Dependency Solver
• Github
• Github post-receive hooks
• Repositorios privados
55
Enlaces de interés
• getcomposer.org
• packagist.org
• github.com/composer
56
¿Preguntas?