Composer - это пакетный менеджер уровня приложений для языка программирования PHP, который предоставляет средства по управлению зависимостями в PHP-приложении.

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

composer.json - это текстовый файл, в котором в формате JSON описаны все сторонние пакеты от которых зависит данный проект.

Например, для того чтобы в некоторый разрабатываемый проект добавить сторонние библиотеки, в нём можно просто создать composer.json и описать в этом файле все необходимые зависимости. После этого для установки всех требуемых внешних PHP пакетов в проект достаточно будет ввести в консоли всего одну команду - composer install.

Другой вариант заключается в применении команды require. В этом случае самостоятельно создавать файл composer.json не нужно. composer require – это команда для установки PHP пакетов в проект посредством Composer. Кроме установки данная команда также автоматически его пропишет в файл composer.json. В дальнейшем для того, чтобы скопировать этот проект, например на другой компьютер, вам не нужно будет переносить туда все внешние пакеты, достаточно будет переместить туда только файл composer.json. Установка всех зависимостей на этом компьютере будет осуществляться уже посредством ввода всего одной команды (composer install).

При использовании команды require, она ещё выполняет создание файла composer.json, если его ещё в нет проекте.

Composer представляет собой обычный PHP скрипт, т.е. программу, написанную на языке PHP.

Основная цель этой программы заключается в том, чтобы предоставить веб-разработчику удобный инструмент, с помощью которого он сможет очень просто загружать и устанавливать пакеты в проект, их обновлять, а также при необходимости осуществлять их удаление. Все эти действия Composer позволяет выполнить с помощью ввода всего одной или нескольких команд. В качестве репозитория пакетов Composer по умолчанию использует packagist.org.

При установке PHP пакетов Composer не просто устанавливает их, он также устанавливает все зависимости, от которых эти пакеты зависят. Т.е., например, если загружаемая библиотека будет зависеть от 3 других пакетов, а каждая из них, ещё в свою очередь от нескольких и так далее, то Composer всё это установит автоматически. В противном случае, т.е. без использования Composer, загрузку и установку основных пакетов, а также всех зависимостей придётся выполнять самостоятельно.

Загрузку сторонних библиотек Composer выполняет в папку vendor, которую данный PHP скрипт создаёт в корневой директории проекта. Кроме этого, он ещё создаёт специальный файл autoload.php, включив который в проект вы сразу же подключите к нему все ранее загруженные им библиотеки.

require "path/to/vendor/autoload.php";

Дополнительно при загрузке сторонних библиотек Composer генерирует ещё файл composer.lock. Если composer.json - это главный файл Composer, в котором содержится описание основных пакетов, включая требования к их версиям, то composer.lock - это файл, содержащий уже не требования, а реальные версии пакетов, которые им были установлены на компьютер пользователя.

Основное назначение файла composer.lock заключается в полном сохранении среды, в которой осуществлялась разработка и тестирование проекта.

Например, если вы захотите скопировать проект в какое-то другое место без переноса файла composer.lock, то выполнив в нём команду composer install, вы можете получить другие версии пакетов. Это может случиться из-за выхода новых версий как основных пакетов, описанных в файле composer.json, так и их зависимостей, зависимостей их зависимостей и т.д. Например, представим что выход новых версий основных пакетов не произошёл, но обновились версии у пакетов, от которых зависят основные пакеты. В результате установки работающего проекта, можем получить неработоспособный, если в какой-нибудь новой версии одного из этих пакетов была допущена ошибка. Поэтому если вы хотите сохранить полностью среду, то при копировании проекта необходимо дополнительно включать в проект файл composer.lock.

Например, разворачивая проект на production, включающий в себя файл composer.lock, вы получите те же версии зависимостей, которые у вас были при разработке и тестировании.

Работа с Composer осуществляется в основном в консольном или терминальном режиме, т.е. с помощью ввода команд через командную строку. Если вы использовали npm, то Сomposer - это нечто подобное, только не для NodeJS, а для PHP.


Команды Composer

Установка пакета

Установка пакета через Composer осуществляется посредством выполнения следующей команды:

composer require vendor/package

vendor - это имя поставщика PHP пакета, а package - это его название.

Например, добавление в проект пакета twig через Composer будет осуществляться так:

composer require "twig/twig:^2.0"

Команда require не только загрузит требуемую библиотеку в проект, но и пропишет её ещё в файле composer.json, т.е. обновит его. Если устанавливаемый пакет зависит от других библиотек, то они также будут установлены или обновлены. Кроме этого ещё будет обновлён файл composer.lock.

Composer позволяет устанавливать пакеты, которые будут доступны только для разработчика. Для этого используйте опцию --dev:

composer require --dev phpunit/phpunit

Установка всех пакетов в проект

Установка сразу всех пакетов в проект осуществляется посредством команды:

composer install

Эта команда работает следующим образом:

  • проверяет, имеется ли файл composer.lock;
  • если файл composer.lock существует, то устанавливает версии, указанные в нём;
  • если файла composer.lock нет, то разрешает зависимости, описанные в файле composer.json, создаёт файл composer.lock и устанавливает зависимости.

Обновление зависимостей

Команда для обновления установленных библиотек:

composer update

Эта команда обновит все зависимости, установленные в проекте до последних версий (в соответствии с composer.json) и файл composer.lock.

Если необходимо обновить не все пакеты, а один или несколько, то их необходимо перечислить через пробел.

Команда для обновления одной библиотеки:

composer update vendor/package

И для пакетов разработчиков:

composer update --dev

Удаление пакета

Команда Composer для удаления пакета из проекта:

composer remove vendor/package

Для удаления одновременно нескольких пакетов можете их перечислить через пробел:

composer remove vendor/package vendor2/package2

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

composer remove --dev phpunit/phpunit

Обновление Composer

Команда для обновления Сomposer до последней версии:

composer self-update

Обновление lock файла без обновления пакетов

Для обновления файла composer.lock без обновления самих пакетов:

composer update --lock

Список пакетов, для которых есть обновления

Можно вывести список пакетов, для которых есть обновления:

composer outdated

Поиск пакетов

Следующей командой можно сделать поиск пакетов в репозиториях:

composer search yii2

Создать новый проект

Создание нового проекта из указанного пакета в текущую директорию выполняется так:

composer create-project vendor/package

Создание нового проекта в указанную директорию выполняется так:

composer create-project vendor/package folder

Вывод всех установленных библиотек

Команда для отображения всех установленных PHP пакетов:

composer show

Краткая информация о Composer

composer about

Команда для диагностики

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

composer diagnose

Показать информацию о лицензиях зависимостей

composer licenses

Проверка валидности файла composer.json

Команда, с помощью которой можно проверить валидность файла composer.json:

composer validate

Вывод списка всех доступных команд

Вывести на экран все доступные команды Composer можно так:

composer list

Очистка внутреннего кэша пакетов Composer

Выполнение очистки внутреннего кэша пакетов Composer осуществляется с помощью команды:

composer clear-cache

Получение подробной справки по команде

Вывод подробной справки по команде:

composer help имя_команды

Например, вывести подробную инструкцию по использованию команды require можно следующим образом:

composer help require

Вывести зависимости для указанного пакета

Вывести все зависимости указанного пакета от других можно с помощью команды:

composer depends vendor/package

Создание базового варианта файла composer.json с помощью мастера

Создание базового варианта файла composer.json с помощью мастера, т.е. посредством ответов на вопросы:

composer init

Утилита задаст несколько вопросов:

  • Package name - имя нового пакета в формате: автор/имя;
  • Description - описание;
  • Author - автор пакета;
  • Minimum Stability - стабильность пакета, можно выбрать dev или stable;
  • Package Type - тип проекта, например: library, project, metapackage, composer-plugin;
  • License - лицензия;
  • Dependencies - здесь вы можете интерактивно найти пакеты, от которых будет зависеть ваш проект.

What is the difference between require and require-dev sections in composer.json?

- Different Environments

Typically, software will run in different environments:

  • development
  • testing
  • staging
  • production

- Different Dependencies in Different Environments

The dependencies which are declared in the require section of composer.json are typically dependencies which are required for running an application or a package in:

  • staging
  • production

environments, whereas the dependencies declared in the require-dev section are typically dependencies which are required in:

  • developing
  • testing

environments.

For example, in addition to the packages used for actually running an application, packages might be needed for developing the software, such as:

  • friendsofphp/php-cs-fixer (to detect and fix coding style issues)
  • squizlabs/php_codesniffer (to detect and fix coding style issues)
  • phpunit/phpunit (to drive the development using tests)
  • etc.

Deployment

Now, in development and testing environments, you would typically run:

composer install

to install both production and development dependencies.

However, in staging and production environments, you only want to install dependencies which are required for running the application, and as part of the deployment process, you would typically run:

composer install --no-dev

to install only production dependencies.

Semantics

In other words, the sections:

  • require
  • require-dev

indicate to composer which packages should be installed when you run:

composer install

or

composer install --no-dev

That is all.