Composer. Установка под Linux. Настрока автозагрузки
Лаконичная заметка по установке, обновлению и настройке менеджера зависимостей под PHP - Composer. Я забегу немного на перед и порекомендую устанавливать composer на глобальном уровне. В дальнейшем будет на много проще работать с ним. Обновления будут разовыми для всех проектов (проблем с несовместимостью не было еще ни разу), не нужно возиться с правами на исполнение и алиасами.
Установка composer
- Локальная установка
composer.phar
в текущий каталог проекта:curl -s http://getcomposer.org/installer | php
Или установка v1 в каталог проекта bin/:
curl -sS https://getcomposer.org/installer | php -- --install-dir=./bin --filename=composer --version=1.10.25
- Глобальная установка/обновление
composer
на уровне системы:curl -sS https://getcomposer.org/installer | php sudo mv composer.phar /usr/bin/composer
Внимание!
Если вы прописывали
alias
наphp composer.phar
в~/.bashrc
:alias composer="php composer.phar"
Удалите его!
Иначе вы получите ошибку: Не найден файл composer.phar при запуске командыcomposer
.
composer init
composer install
Подключаем файл автозагрузки composer в проект (в случае, если вы не используете фреймворк):
<?php require_once 'vendor/autoload.php'; ?>
Обновление composer
Обновление Composer:
sudo composer self-update # глобально, если путь к composer добавлен в PATH
sudo /usr/bin/composer self-update # глобально (обновление глобально установленного Composer)
php composer.phar self-update # локально
После обновления вы увидите сообщение о том, как откатится до предыдущей версии:
Updating to version a309e1d89ded6919935a842faeaed8e888fbfe37.
Downloading: 100%
Use composer self-update --rollback to return to version d79f2b0fd33ee9b89f3d9f1969f43dc3d570a33a
Примечание:
Для упрощения доступа к локально установленному Composer
можно использовать следующие aliases
:
alias composer_download="curl -s http://getcomposer.org/installer | php"
alias composer="php composer.phar
Чтобы эти сокращения были доступны после перезагрузки - добавьте их в файл ~/.bashrc
и выполните:
source ~/.bashrc
Также рекомендую обратить внимание на расширение oh-my-zsh для оболочки ZSH. Очень хорошо решает вопрос дополнения консольных команд разных фреймворков, утилит и библиотек.
Управление зависимостями
Для загрузки и обновления всех зависимостей, указанных в сomposer.json выполните:
php composer.phar update
Для загрузки последних используемых зависимостей из файла сomposer.lock запустите:
php composer.phar install
Обновление определенного пакета до указанной версии используйте require:
php composer.phar require jakoch/phantomjs-installer:1.9.8
Внимание!
При ошибке composer exceeded the timeout of 300 seconds необходимо увеличить время выполнения скрипта:
COMPOSER_PROCESS_TIMEOUT=2000 composer install
Настройка composer.json
Описание основных настроек файла конфигурации composer.json:
{
"name": "%VendorName/PackageName%",
"description": "%Description%",
"minimum-stability": "dev",
"authors": [
{
"name": "%author name%",
"email": "%email%"
}
],
"require-dev": {
# Секция зависимостей для разработки
},
"require": {
# Секция зависимостей проекта
"php": ">=5.4.0",
"gabordemooij/redbean": "v3.5.1",
"bestdeveloper/php-github-api": "1.2.x-dev",
"icanboogie/inflector": "*",
"facebook/php-sdk" : "dev-master",
"rdlowrey/Artax": "0.6.*",
"propel/propel": "2.0.0-alpha2",
"jeckman/YouTube-Downloader": "dev-master",
"vendor/local-git-composer-project": "dev-hotfix",
"vendor/repository": "dev-stage"
},
"repositories": [
{
"type": "vcs",
"url": "/path/to/local-git-composer-project"
},
{
"type": "git",
"url": "git@github.com:vendor/repository.git"
},
{
"type": "package",
"package": {
"name": "jeckman/YouTube-Downloader",
"version": "dev-master",
"source": {
"url": "https://github.com/jeckman/YouTube-Downloader",
"type": "git",
"reference": "origin/master"
}
}
}
],
"autoload" : {
"files": ["bootstrap/init.php"],
"classmap": ["library", "helpers", "/usr/library/some.class.php"],
"psr-0": {
"SomePackage": "includes/"
}
}
}
Версии пакетов
Маски, применимые для указания версии пакета:
dev-master
dev-bugfix
dev-master#ab7cde7
~3.4 - все версии, вплоть до 3.999 но не включая 4.0
3.* - версии между 3.0.0 и 3.9.9 (не включая 4.0)
3.4.* - любая "релизная" версия (3.4.1, 3.4.N)
>=2 - версия пакета 2.0.0 или выше
>=1.8,<2.0-dev - от 1.8 но до 2.0-dev
Советы
- Не устанавливайте жесткие ограничения, если на то нет обоснованных причин - это упростит обновление зависимостей в будущем. Но, при этом старайтесь указывать максимально доступную верхнюю границу версии.
- Если позволяет ситуация используйте * вместо dev-master.
- Не указывайте ограничение версии комбинируя условия сравнения и маски (wildcards), например: >=2.* - сomposer может не понять какую версию вы хотите.
Автозагрузка
Composer предоставляет также может выполнять ф-ции автозагрузки классов. Все, что вам необходимо, это сгенерировать/обновить и подключить файл автозагрузки vendor/autoload.php:
$loader = require_once __DIR__.'/vendor/autoload.php';
Files
Подключение файлов перед инициализацией приложения
Classmap
Загрузка классов из каталога и загрузка отдельных конкретных классов, которые расположены в каталогах без соблюдения стандартов PSR*.
PSR-0
Этот стандарт требует указание пути к родительскому каталогу пакета (не к пакету, а именно к родительской директории в которой лежит каталог с библиотекой). Описание стандарта: http://www.php-fig.org/psr/psr-0/. Например, для PSR-0 "MyPackage": "library/" файловая структура будет такой:
library/
MyPackage/
PSR-4
В этом стандарте для Namespace\\ указывается путь непосредственно к каталогу с пакетом!
Внимание!
Стандарты PSR-0 и PSR-4 чувствительны к регистру! Загрузчик не найдет namespace Model если классы расположены в подкаталоге model/.
Примеры
Пример использования loader'а composer для авто подключения классов:
Указать каталог с классами без namespace (PSR-0):
$loader->add('', [
APP_DIR.'/controllers',
APP_DIR.'/models',
]);
Указать путь к родительской директории пакета:
$loader->add('MyVendor\\', [__DIR__ . '/third']); // ./third/MyVendor/Component/
Указать каталог в котором расположен пакет (PSR-4):
$loader->addPsr4('MyVendor\\', [__DIR__ . '/third/MyVendor']);
Указать соответствие между Namespace\Class и файлом:
$loader->addClassMap([
'Some\Class' => 'some/claSS-File.php'
]);
Autoload в composer.json
Для управления автозагрузкой через composer.json используйте секцию конфига - autoload
:
"autoload" : {
"psr-0": {
"VendorName": "path/to/parent/dir/for/VendorName/",
"OtherVendor": "other/path/",
},
"psr-4": {
"UsefulPackage\\": "app/library/useful-package"
}
"classmap": ["app/SomeDir/some-Class.php", "MyClasses/"],
"files": ["bootstrap/config.php"]
}
Описание секции autoload:
psr-0 Хеш, в котором можно указать имя вендора и путь к родительскому каталогу вендора
psr-4 Хеш, в котором можно указать имя вендора\\ и путь к каталогу вендора
classmap Массив классов/каталогов, которые не соответствуют стандарту PSR-0
files Массив файлов, которые необходимо подключить на этапе bootstrap
Пример кода для автозагрузки массива Namespace:
/** @var \Composer\Autoload\ClassLoader $loader Composer loader */
$loader = require_once BASE_DIR.'/vendor/autoload.php';
define('APP_DIR', substr(__DIR__, 0, strrpos(__DIR__, DIRECTORY_SEPARATOR)));
// Specify a targets Packages as simplified PSR-4
$map = [
'' => APP_DIR.'/controllers',
'Controllers' => APP_DIR.'/controllers',
'Models' => APP_DIR.'/models',
];
// Register Namespaces
foreach ($map as $namespace => $path) {
$namespace = $namespace ? rtrim($namespace, '\\') . '\\' : '';
$path = is_array($path) ? $path : [$path];
$loader->addPsr4($namespace, $path);
}
#composer, #autoload, #spl, #psr-0, #psr-4, #classmap