Composer. Решаем проблему зависимостей в PHP

Я прочитал про Composer на хабре и решил подключить этот менеджер зависимостей в новом проекте. По большому счету мне нужен был просто автолоадер, но просто заюзать spl_autoload_register не так романтично). Учитывая, что проект рассчитан на PHP 5.3, а composer требует версию PHP 5.3+.

Установка

Переходим в каталог нашего проекта и выполняем в консоли:

curl -s http://getcomposer.org/installer | php
// или так
wget http://getcomposer.org/composer.phar

В корне проекта появился phar-архив composer.phar ~530KB.

При установке composer предупредил, что могут возникнуть проблемы и попросил установить временную зону в php.ini. Для Киева это:

date.timezone = Europe/Kiev

Настройка

Для описания зависимостей создаем файл composer.json в корне проекта. Если необходимые библиотеки (фреймворки) доступны в виде Composer-пакетов на сайте (packagist.org)[http://packagist.org], задавать для них репозиторий нет необходимости.

{
  "require" : {
    "php" : ">=5.3.0",
    "slim/slim" : "dev-master"
  }
}

Использование

Установить пакеты

Устанавливает новые пакеты, которые вы добавили в composer.json и обновляет существующие.

php composer.phar install

Обновить пакеты

Обновляет только ранее установленные пакеты.

php composer.phar update
Если вы не правильно указали classmap, пути к файлам можно поправить в /vendor/composer/installed.json. После чего повторно запустить update

Обновить composer

php composer.phar self-update

composer.json

Расширенные настройки.

Показать »

{
  "require" : {
    "php" : ">=5.3.0",
    "slim/slim" : "dev-master"
  },
  "repositories" : 
  [
    {
      "type" : "package",
      "package" : {
        "name" : "kla/php-activerecord",
        "version" : "1.0",
        "source" : {
          "type"    : "git",
          "url" : "https://github.com/kla/php-activerecord",
          "reference" : "master"
        },
        "autoload" : {
          "classmap" : ["ActiveRecord.php"]
        }
      }
    }
  ]
}
  • require
    • "slim/slim" : "dev-master" — задаем имя вендора и пакета. dev указывает что это ветка разработки (branch), master — имя ветки. Применимо только для composer-пакетов! Для библиотек из репозитория, которые не оформлены как composer-пакеты нужно задавать версию.
  • repositories
    • package
      • autoload
        • classmap — поиск классов
        • files — принудительное подключение файла

Примеры

Подключаем phpQuery и Simple HTML DOM Parser. Я намеренно обобщил эти библиотеки в каталог libraries и не указывал вендор каждой:

Показать »

{
  "require" : {
    "libraries/phpquery"      : "0.9.5",
    "libraries/simplehtmldom" : "1.5"
  },
  "repositories" : [
    {
      "type" : "package",
      "package"  : {
        "name"    : "libraries/phpquery",
        "version" : "0.9.5",
        "dist"  : {
          "type"  : "zip",
          "url"  : "http://phpquery.googlecode.com/files/phpQuery-0.9.5.386.zip"
        },
        "autoload": {
          "classmap"  : ["phpQuery/phpQuery.php"]
        }
      }
    },
    {
      "type" : "package",
      "package"  : {
        "name"    : "libraries/simplehtmldom",
        "version" : "1.5",
        "dist"  : {
          "type"  : "zip",
          "url"  : "http://downloads.sourceforge.net/project/simplehtmldom/simplehtmldom/1.5/simplehtmldom_1_5.zip?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fsimplehtmldom%2F&ts=1342886637&use_mirror=kent"
        },
        "autoload": {
          "files"    : ["simple_html_dom.php"]
        }
      }
    }
  ]
}

Подключаем в composer Slim, phpActiveRecord, RedBean (RedBean уже имеет пакет), и Smarty:

Показать »

{
  "require" : {
    "php" : ">=5.3.0",
    "slim/slim" : "dev-master",
    "kla/php-activerecord" : ">=1.0",
    "gabordemooij/redbean" : ">=3.2.3",
    "smarty/smarty" : "3.1.11"
  },
  "repositories" : [
    {
      "type" : "package",
      "package" : {
        "name" : "kla/php-activerecord",
        "version" : "1.0",
        "source" : {
          "type" : "git",
          "url" : "https://github.com/kla/php-activerecord",
          "reference" : "master"
        },
        "autoload" : {
          "classmap" : ["ActiveRecord.php"]
        }
      }
    },
    {
      "type" : "package",
      "package" : {
        "name" : "gabordemooij/redbean",
        "version" : "3.2.3",
        "homepage" : "http://www.redbeanphp.com",
        "dist" : {
          "type" : "zip",
          "url" : "https://github.com/gabordemooij/redbean/zipball/master"
        },
        "source" : {
          "type" : "git",
          "url" : "https://github.com/gabordemooij/redbean.git",
          "reference" : "master"
        },
        "autoload" : {
          "classmap" : ["RedBean/redbean.inc.php"]
        }
      }
    },
    {
      "type" : "package",
      "package" : {
        "name" : "smarty/smarty",
        "version" : "3.1.11",
        "dist" : {
          "type" : "zip",
          "url" : "http://www.smarty.net/files/Smarty-3.1.11.zip"
        },
        "source" : {
          "type" : "svn",
          "url" : "http://smarty-php.googlecode.com/svn/",
          "reference" : "tags/Smarty_3_1_11/distribution/"
        }
      }
    }
  ]
}
Вчера, 22.07.2012, автор RedBean оформил ORM composer-пакетом и добавил на packagist.org. Теперь ORM можно подключить не указывая репозиторий:

"require" : {
  "gabordemooij/redbean" : "dev-master"
}

Подключаем Twitter Bootstrap, Silex, RedBean:

Показать »

{
    "require": {
            "php": ">=5.3.3",
            "silex/silex": "1.0.*",
            "gabordemooij/redbean" : "dev-master",
            "twitter/bootstrap": "2.1.0"
        },
     "minimum-stability": "dev",
     "repositories": [
        {
           "type": "package",
           "package": {
               "name": "twitter/bootstrap",
               "version": "2.1.0",
               "dist": {
                   "url": "http://twitter.github.com/bootstrap/assets/bootstrap.zip",
                   "type": "zip"
               }
           }
        }
    ]
}

Проблемы

Если Composer отваливается при обновлении с ошибкой: [RuntimeException] The process timed out. нужно увеличить тайм-аут ожидания:

COMPOSER_PROCESS_TIMEOUT=600 php composer.phar install

Источники