Статьи

Простое управление пакетами с помощью Composer

Посмотрим правде в глаза: у PHP сложная история с управлением пакетами, и в результате довольно редко можно найти разработчика, который активно использует такие системы, как PEAR. Вместо этого большинство разработчиков выбрали свой любимый фреймворк, в котором специально написан код для обработки различных вещей, таких как взаимодействие с БД, ORM, интеграция OAuth, Amazon S3 и т. Д.

Недостатком здесь является то, что переключение фреймворков (или вообще отказ от использования фреймворка) может быть кошмаром, так как включает в себя переучивание всего, чтобы использовать новые инструменты — и это нелегкая задача. Ну, Composer может это исправить!


«Клей между всеми проектами».

Composer намеревается разрешить эту ситуацию, позиционируя себя как «связующее звено между всеми проектами», что означает, что пакеты можно писать, разрабатывать и совместно использовать в формате, который другие разработчики могут легко подключать к другим приложениям.

В этой статье показано, как установить и работать с пакетами Composer. К концу этой статьи вы сможете подключить и поиграть с кусками кода в любой среде , независимо от того, работаете ли вы с CodeIgniter , FuelPHP , Laravel , Symfony2 , Lithium , Yii , Zend … или чем-то еще.


Composer состоит из двух основных логических частей: есть хранилище, в котором хранятся пакеты, а также приложение для командной строки, которое помогает вам находить, загружать, обновлять и обмениваться кодом.

Установить приложение на любую версию Unix легко:

1
2
$ cd /path/to/my/project
$ curl -s http://getcomposer.org/installer |

Это так просто! Теперь у вас есть файл composer.phar указанный в вашем проекте, который содержит всю логику для утилиты командной строки.

Вы можете подтвердить, что он был установлен, запустив:

1
$ php composer.phar

Эта команда покажет все доступные команды.

Моё личное предпочтение — запустить дополнительную команду:

1
$ sudo mv composer.phar /usr/bin/composer

Это переместит файл в вашу корзину, что позволит вам получить доступ ко всем командам с гораздо более коротким примером:

1
$ composer about

Если вы работаете в Windows, вы можете просто загрузить этот файл и запустить его через интерпретатор PHP — где бы он ни был установлен.


Если вы разработчик Ruby, вы, вероятно, знакомы с Gemfile . Или разработчики Node узнают о package.json . Точно так же Composer использует файл composer.json чтобы указать настройки и требования к пакетам для вашего приложения.

В своей основной форме файл композитора будет выглядеть так:

1
2
3
4
5
{
    «require»: {
        «kriswallsmith/assetic»: «*»
    }
}

Для этого потребуется пакет «Assetic», созданный «kriswallsmith», и потребуется любая версия. Чтобы указать конкретную версию, вы могли бы вместо этого использовать:

1
«kriswallsmith/assetic»: «1.0.3»

Вы даже можете объединить два подхода, вот так:

1
«kriswallsmith/assetic»: «1.0.*»

Это позволит автоматически включать любое незначительное обновление, но не обновлять до 1.1.0, так как это может привести к некоторым изменениям интерфейса, за которыми разработчик должен будет следить.


Теперь, когда у вас есть один или несколько пакетов, перечисленных в вашем composer.json , вы можете запустить:

1
$ php composer.phar install

… Или, если вы использовали мой трюк, чтобы сократить его на машинах Unix (см. Выше):

1
$ composer install

Теперь вы заметите, что файлы загружаются и помещаются в новую папку vendors/ в корне вашего приложения. Эту логику можно изменить, используя следующую опцию конфигурации:

1
2
3
4
5
6
7
8
{
    «require»: {
        «kriswallsmith/assetic»: «1.0.*»
    },
    «config» : {
        «vendor-dir» : «packages»
    }
}

Автозагрузка в PHP некоторое время была беспорядком.

Автозагрузка в PHP некоторое время была беспорядком, так как у каждого разработчика есть свои способы обработки вещей. Некоторые пакеты, такие как Smarty , используют собственную автозагрузку, некоторые разработчики помещают несколько классов в один файл или имеют имена файлов в нижнем регистре — все это очень случайно.

PSR-0 — это стандарт, созданный группой стандартов PHP, чтобы смягчить этот беспорядок; Composer будет работать с ним по умолчанию. Composer поставляется с автозагрузчиком PSR-0, который вы можете включить в свой проект только одной строкой:

1
include_once ‘./vendor/autoload.php’;

Очевидно, что если вы изменили каталог вендора, вам нужно его обновить.

Теперь вы можете использовать код в своих приложениях:

01
02
03
04
05
06
07
08
09
10
11
12
13
<?php
 
use Assetic\Asset\AssetCollection;
use Assetic\Asset\FileAsset;
use Assetic\Asset\GlobAsset;
 
$js = new AssetCollection(array(
    new GlobAsset(‘/path/to/js/*’),
    new FileAsset(‘/path/to/another.js’),
));
 
// the code is merged when the asset is dumped
echo $js->dump();

Это пример использования Assetic. Да, там много кода пространства имен, но это сделано, чтобы избежать конфликтов между пакетами. Соглашение об именах для PSR-0 по существу:

1
\<Vendor Name>\(<Namespace>\)*<Class Name>

Другим примером может быть HTTP-пакет Buzz, который выглядит так:

1
2
3
4
5
$browser = new Buzz\Browser;
$response = $browser->get(‘http://www.google.com’);
 
echo $browser->getLastRequest().»\n»;
echo $response;

Это может выглядеть как прославленный file_get_contents() , но он обрабатывает все виды интеллектуальной логики в фоновом режиме для работы с HTTP Response / Request — и вы можете видеть, что синтаксис пространства имен немного менее интенсивен.


Если вы хотите быть действительно умным, вы можете автоматизировать весь процесс.

В настоящее время большинство проектов хранит все зависимости PHP в основном хранилище кода; так, например, если вы используете Facebook SDK, вы просто вставляете эту версию в свой код, копируя код из GitHub или извлекая ZIP-файл. Затем вы добавляете его в свою систему управления версиями и вносите изменения.

Затем эта версия хранится в вашем коде в виде статического файла, который в какой-то момент вы можете помнить или не помнить об обновлении — ЕСЛИ вы заметили, что Facebook выпустил обновленную версию. Новая версия файла выходит за рамки, и вы также вносите эти новые изменения.

Вы можете использовать Composer, чтобы не обращать внимания на версии, просто запустить обновление и зафиксировать все изменения. Но почему в вашем хранилище загружено много кода, который вам не нужен?

Самое лучшее решение — добавить vendors/ в ваш список «Игнорировать» (например, .gitignore) и полностью исключить ваш код. При развертывании кода на хостах вы можете просто запустить composer install composer update или composer update .

Если вы хотите быть действительно умным, вы можете автоматизировать весь процесс, поэтому, если у вас есть хостинг в облаке , вы можете настроить хуки для запуска composer install как только ваш новый код будет загружен!


Вы начнете видеть намного больше Composer, поскольку различные PHP-фреймворки начали предоставлять различные уровни интеграции; FuelPHP будет собираться в виде пакетов Composer, CodeIgniter будет поддерживать автозагрузку, а Symfony2 уже широко его использует.

Composer — это отличный способ добавить зависимости в ваши проекты без необходимости устанавливать расширения PECL или копировать и вставлять кучу файлов. Такой способ работы чрезвычайно устарел и требует слишком много времени разработчика.