Эта статья была рецензирована Верной Анчетой . Спасибо всем рецензентам SitePoint за то, что сделали контент SitePoint как можно лучше!
Эта популярная статья была обновлена 21 мая 2017 года, чтобы дать более полное представление о существенном, современном инструменте.
В этой статье мы рассмотрим основы Composer и то, что делает его таким мощным и полезным инструментом.
Прежде чем мы углубимся в детали, нам нужно иметь в виду две вещи:
- Что такое композитор:
Как мы видим на их сайте : «Composer — это инструмент для управления зависимостями в PHP. Он позволяет вам объявлять библиотеки, от которых зависит ваш проект, и будет управлять (устанавливать / обновлять) их за вас ».
- Чем не является Композитор:
Композитор не является менеджером пакетов. Он имеет дело с пакетами, но «на проект». Хотя он предоставляет глобальную опцию установки, он не устанавливает ничего по умолчанию.
По сути, Composer позволяет вам объявлять и управлять каждой зависимостью ваших проектов PHP.
Давайте теперь установим Composer, чтобы мы могли видеть его в действии.
Установка
Существует два способа установки Composer: локально и глобально. Поскольку Composer является таким полезным и широко распространенным инструментом, я всегда рекомендую устанавливать его глобально, поскольку вы, вероятно, будете работать над несколькими проектами одновременно.
Обратите внимание, что если вы используете среду вроде Homestead Improved , по умолчанию она устанавливается глобально. Если вы не знакомы с Vagrant и Homestead, этот пост прояснит ситуацию, и если вы хотите погрузиться глубже, эта книга откроет вам некоторые дикие загадки .
Чтобы установить Composer, следуйте инструкциям для вашей операционной системы.
Если вы работаете в системе Unix, после установки вы можете выполнить команду:
mv composer.phar /usr/local/bin/composer
Это перемещает файл composer.phar
в каталог, который находится на вашем пути (расположение вашей файловой системы, где ОС ищет исполняемые файлы по умолчанию). Таким образом, вы можете использовать только команду composer
вместо composer.phar
.
При запуске команды composer
отображается информационная страница:
Некоторые из наиболее полезных команд Composer:
-
composer help <command>
— покажет страницу справки для данной команды. -
composer self update
— обновляет композитор до последней доступной версии. -
composer search
— поиск пакетов. -
composer status
— показывает список зависимостей, которые были изменены локально. Если мы установим что-либо из источника (используя--prefer-source
), мы получим клон этого пакета в папке/vendor
. Если мы сделаем некоторые изменения в этом пакете, командаcomposer status
покажет нам git-статус для этих изменений. -
composer diagnose
— диагностирует систему на наличие распространенных ошибок. Это особенно полезно для отладки, так как проверяет такие вещи, как подключение к Packagist, свободное место на диске и настройки git.
Мы сосредоточим наше внимание на composer init
, composer create-project
и composer require
.
Использование Composer
Для управления зависимостями в проекте Composer использует файл json
. Этот файл описывает все зависимости, а также содержит некоторые метаданные.
В этом примере мы создадим новый проект PHP, в котором нам понадобится PHPUnit для нашего модульного тестирования. Есть несколько способов использовать Composer для управления этой зависимостью.
-
composer init
запустит мастер. Мастер проведет нас через генерацию нашего файлаcomposer.json
. -
composer search phpunit
будет искать все доступные пакеты,phpunit
ключевое словоphpunit
. После того, как мы выбрали нужный пакет, мы можем использоватьcomposer require <package>
. Эта команда не только создаст файлcomposer.json
, но и загрузит все указанные зависимости. - Вручную напишите файл
composer.json
(не рекомендуется — легко поддается синтаксису и не дает очевидных преимуществ). Вот пример:
{ "require": { "phpunit/phpunit": "^4.8" } }
- Ключ
require
переводит объекты, которые отображают имена пакетов (например,phpunit/phpunit
), в ограничения версии (например,4.8
). Composer использует эту информацию для поиска нужного набора файлов в «репозиториях» пакетов, которые вы регистрируете с помощью ключаrepositories
(подробнее здесь ) или в Packagist , репозитории пакетов по умолчанию, о котором мы поговорим чуть позже.
Если вы использовали composer init
или ручной метод, вам нужно запустить composer install
. Это загрузит все зависимости, необходимые для пакетов, описанных в файле composer.json
.
Обратите внимание, что написание файла вручную и последующая composer install
— это то же самое, что и запуск composer require <package>
.
Использование подхода
composer require <package>
является рекомендуемым лучшим методом.
При первом запуске команды composer install
загружаются зависимости и их установленные версии регистрируются в файле composer.lock
. В следующий раз, когда кто-то запустит composer install
в проекте, он не получит последние доступные версии пакетов, а те, которые зарегистрированы в файле composer.lock
. Таким образом, Composer гарантирует, что ваш проект не сломается из-за неожиданных изменений кода в более новых версиях пакетов.
Обновление ваших пакетов
Файл composer.lock
гарантирует, что все в проекте используют одну и ту же версию пакетов, не позволяя загружать более новые версии.
Если по какой-либо причине мы хотим придерживаться определенной версии, то мы должны упомянуть соответствующую версию в файле composer.json
. Например:
{ "require": { "phpunit/phpunit": "4.8" } }
Но что, если мы хотим обновить наши зависимости до последних версий?
Чтобы обновить зависимости, Composer предоставляет команду composer update
. Эта команда не только загрузит последние версии наших зависимостей, но и обновит файл composer.lock
до новых версий. Запуск composer update
фактически аналогичен удалению composer.lock
и повторному запуску composer install
.
Обычно рекомендуется фиксировать файл
composer.lock
в системе контроля версий при работе над проектом (приложением) и игнорировать его при работе с пакетом. Пакет должен всегда стремиться использовать последнюю версию своих зависимостей, в то время как приложение обычно более хрупкое. Подробнее об этом и альтернативных подходах здесь .
Папка продавца
Composer загружает все зависимости в папку /vendor
, которую он создает, если ее не существует. Он также создает файл vendor/autoload.php
который выглядит примерно так:
<?php // autoload.php @generated by Composer require_once __DIR__ . '/composer/autoload_real.php'; return ComposerAutoloaderInit7a731d2067108a4739c3dd65be722f17::getLoader();
Как только вы include
или require
этот файл в своем коде, вы сможете использовать все функции, предоставляемые вашими зависимостями. Это так же просто, как добавить следующий фрагмент в ваш код:
require __DIR__ . '/vendor/autoload.php';
Автозагрузка
Автозагрузка, предоставляемая Composer для доступа к зависимостям проекта, очень полезна и может также использоваться для доступа к коду нашего собственного приложения. Для этого нам нужно зарегистрировать наш код в файле composer.json
используя ключ autoload
.
{ "autoload": { "psr-4": {"Foo\\": "src/"} } }
Сначала Composer зарегистрирует автозагрузчик PSR-4 для пространства имен Foo
.
Затем мы сопоставляем пространство имен Foo
с папкой /src
. Папка /src
должна находиться на том же уровне, что и папка /vendor
(корень проекта). После этого нам нужно заново сгенерировать файл vendor/autoload.php
. Composer предоставляет команду для этого: composer dump-autoload
.
Pro-tip: composer du
также будет работать, потому что composer запускает любую команду, которая уникально идентифицируется по ее первым буквам В случае dump-autoload
в пространстве имен Composer нет другой команды, начинающейся с du
, поэтому Composer знает, что это именно то, что нам нужно. Это работает со всеми командами Composer.
Таким образом, мы добавляем наш собственный код в автозагрузчик. В дополнение к автозагрузке PSR-4 Composer также поддерживает PSR-0, карту классов и автозагрузку файлов. Ознакомьтесь с документацией для получения дополнительной информации об автозагрузке с помощью Composer.
Значения конфигурации и минимальная стабильность
Иногда ваш проект будет зависеть от пакетов, для которых не выпущена стабильная версия. Composer по умолчанию предотвращает установку нестабильных пакетов.
В этих случаях легко добавить флаг minimum-stability
в файл composer.json
, и Composer разрешит их установку.
composer config minimum-stability dev
Почти все значения конфигурации могут быть отредактированы из командной строки, как объяснено в этом разделе документов.
Глобальные пакеты
Некоторые пакеты могут пригодиться, если установлены глобально. Например, такие инструменты, как Spress и Laravel, могут иметь инструменты командной строки для генерации новых проектов, повторного запуска некоторых общих команд и т. Д. Аналогично, набор тестов, такой как PHPUnit, может выиграть от запуска из любой части системы и делает Проект это тестирование гораздо легче.
В общем, пакеты могут быть установлены глобально с помощью global
опции, например:
composer global require phpunit/phpunit
Однако, по мнению некоторых , это считается вредным. Ваш пробег может варьироваться — мы, как правило, обнаружили, что если следовать профессиональному и современному подходу к разработке в изолированной среде , global require
на 100% безопасны в использовании.
Packagist
Packagist — главный репозиторий Composer. Именно здесь агрегируются все пакеты Composer, а это означает, что когда мы выполняем composer search <package>
мы на самом деле ищем Packagist. Веб-сайт Packagist также содержит информацию обо всех пакетах и полезную систему поиска и сортировки. Таким образом, разработчикам PHP не нужно тратить дни на поиск пакетов на Github.
Packagist не только собирает пакеты PHP, но и побуждает разработчиков PHP представлять свои собственные пакеты, укрепляя сообщество.
Отправка пакета в Packagist
Давайте создадим простой пакет PHP, чтобы мы могли видеть, как легко отправить его в Packagist. Мы собираемся создать простой класс, который преобразует дюймы в сантиметры, а сантиметры в дюймы. Давайте создадим файл /src/Converter/Converter.php
. Внутри этого файла у нас будет следующий код:
<?php namespace Converter; class Converter { public function convertToCm($value) { return $value * 0.3937; } public function convertToInch($value) { return $value * 2.54; } }
Как видите, очень простой класс. Второй шаг — перейти к корню нашего проекта и запустить команду composer init
чтобы запустить мастер и сгенерировать файл composer.json
.
Последнее, что нам нужно сделать, это добавить ключ автозагрузки в наш файл composer.json
. Конечный файл должен выглядеть так:
{ "name": "dailymatters/inch-conv", "description": "Inch To Cm converter", "type": "library", "license": "creative commons", "authors": [ { "name": "DailyMatters", "email": "[email protected]" } ], "minimum-stability": "dev", "require": {}, "autoload": { "psr-0": { "Converter": "src/" } } }
Теперь давайте запустим composer install
чтобы можно было создать наш автозагрузчик. Тогда давайте проверим наш пакет. В корне нашего проекта давайте создадим файл index.php
.
<?php require_once '/vendor/autoload.php'; use Converter\Converter; $conv = new Converter; $result = $conv->convertToCm(1); echo $result; $result = $conv->convertToInch(1); echo $result;
Как видите, мы используем require_once '/vendor/autoload.php';
строка для автозагрузки нашего класса, а затем использовать его для некоторых преобразований.
Тестирование его в командной строке с помощью php index.php
должно дать желаемый результат.
Чтобы отправить этот пакет в Packagist, нам нужно отправить его в репозиторий Github. Затем мы регистрируемся в Packagist, используя нашу учетную запись Github, нажимаем « Submit
и указываем на наше недавно созданное Github-репо.
Не забывайте обновлять Packagist всякий раз, когда вы обновляете репозиторий в Github! Вы можете настроить Packagist на автоматическую загрузку или получить доступ к пакету в Packagist и нажать кнопку «
Update
. Таким образом, ваш пакет в Packagist всегда будет отражать состояние вашего пакета Github.
Вывод
Composer произвел революцию в работе PHP-разработчиков и обещает продолжать в том же духе. Это мощный и необходимый инструмент для пояса любого разработчика PHP и краеугольный камень многих современных приложений PHP.
Вы используете Composer? Что-то про это неясно? Дайте нам знать в комментариях ниже.