Composer
Zarządzanie zależnościami w PHP

Michał Pipa
21 czerwca 2012

O mnie

Ankieta

Zarządzanie zależnościami

PEAR

PEAR

Frankly, the PEAR packages are more or less obsolete as we now have Composer. Installing Symfony or any other framework for that matter globally on a system does not make much sense.
Fabien Potencier, Tests in PEAR packages?
Composer logo

Jak działa Composer?

Composer

Composer

Inspiracja

Autorzy

Composer

Instalacja

$ curl -s http://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer

Aktualizacja

$ composer.phar self-update

Definiowanie zależności dla projektu

composer.json

{
    "require": {
        "monolog/monolog": "1.0.*"
    }
}
$ composer.phar install
Installing dependencies
  - Installing monolog/monolog (1.0.2)
    Downloading: 100%

Writing lock file
Generating autoload files

Instalowanie zależności w projekcie

$ git clone git://github.com/symfony/symfony-standard.git
$ cd symfony-standard
$ composer.phar install
Installing dependencies from lock file
  - Installing doctrine/common (2.2.2)
    Downloading: 100%
[...]
symfony/symfony suggests installing doctrine/data-fixtures (1.0.*)
[...]
Generating autoload files
Clearing the cache for the dev environment with debug true
Installing assets using the hard copy option
Installing assets for Acme\DemoBundle into web/bundles/acmedemo
[...]

Co zostało utworzone?

composer.lock

composer.lock

{
    "hash": "e4e3109acc8a04877ee974efb7478127",
    "packages": [
        {
            "package": "monolog/monolog",
            "version": "1.0.2"
        }
    ],
    "packages-dev": null,
    "aliases": [

    ],
    "minimum-stability": "dev",
    "stability-flags": [

    ]
}

Autoloader

require 'vendor/autoload.php';

Autoloader

Przykład użycia Monologa:

$log = new Monolog\Logger('name');
$log->pushHandler(new Monolog\Handler\StreamHandler('app.log',
    Monolog\Logger::WARNING));

$log->addWarning('Foo');

PSR-0

Jest to mapowanie nazwy klasy (razem z przestrzenią nazw) na ścieżkę do pliku z definicją tej klasy, aby ją następnie załadować.

\Doctrine\Common\IsolatedClassLoader
=>/path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
\Symfony\Core\Request
=> /path/to/project/lib/vendor/Symfony/Core/Request.php
\Zend\Acl => /path/to/project/lib/vendor/Zend/Acl.php
\Zend\Mail\Message
=> /path/to/project/lib/vendor/Zend/Mail/Message.php
\namespace\package\Class_Name
=> /path/to/project/lib/vendor/namespace/package/Class/Name.php
\namespace\package_name\Class_Name
=> /path/to/project/lib/vendor/namespace/package_name/Class/Name.php

Implementacja: ClassLoader (komponent Symfony)

Packagist

Packagist

Packagist

Packagist

Packagist

Typy repozytoriów

Satis

Pytania

Dziękuję za uwagę