Composer. Установка под Linux. Настрока автозагрузки

Категория: PHP

Лаконичная заметка по установке, обновлению и настройке менеджера зависимостей под PHP - Composer. Я забегу немного на перед и порекомендую устанавливать composer на глобальном уровне. В дальнейшем будет на много проще работать с ним. Обновления будут разовыми для всех проектов (проблем с несовместимостью не было еще ни разу), не нужно возиться с правами на исполнение и алиасами.

Установка composer

  1. Локальная установка 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
  2. Глобальная установка/обновление 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.json) в каталоге проекта и генерацию autoload файла:
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
Советы
  1. Не устанавливайте жесткие ограничения, если на то нет обоснованных причин - это упростит обновление зависимостей в будущем. Но, при этом старайтесь указывать максимально доступную верхнюю границу версии.
  2. Если позволяет ситуация используйте * вместо dev-master.
  3. Не указывайте ограничение версии комбинируя условия сравнения и маски (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/.

Примеры

Пример использования loadercomposer для авто подключения классов:

Указать каталог с классами без 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

категория: PHP