Статьи

Повторное представление Composer — краеугольный камень современных приложений PHP

Эта статья была рецензирована Верной Анчетой . Спасибо всем рецензентам 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

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 .

Запустите init на нашем пакете

Последнее, что нам нужно сделать, это добавить ключ автозагрузки в наш файл 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? Что-то про это неясно? Дайте нам знать в комментариях ниже.