Установка пакетов Composer
Если вы используете composer.phar
локально, то приведённые команды необходимо соответственно изменить в зависимости от того как настроено ваше окружение. Например, если файл composer.phar
находится в текущем каталоге и интерпретатор PHP доступен без указания пути к нему, то установка пакета будет осуществляться так:
php composer.phar require vendor/package
При глобальной установке:
composer require vendor/package
Проект на основе пакета
Чаще всего вы будете разворачивать проекты Composer на основе уже существующих пакетов. В этом случае утилита берёт пакет из репозитория и просто распаковывает его в текущую папку, все зависимости помещаются в папку vendor
. Для этого используется команда create-project
:
composer create-project laravel/laravel ./
Вторым параметром утилите надо передать папку, в которой будет развёрнут проект. В данном случае это текущая папка. После завершения установки вы получите уже развёрнутое приложение и можете начинать его модифицировать.
Установка пакета
Установка пакета через Composer осуществляется посредством выполнения следующей команды, где vendor
это имя поставщика php пакета, а package
это его название:
composer require vendor/package
Пакеты могут установливаться в две секции:
require
указываются пакеты, которые необходимы для работы проектаrequire-dev
указывают пакеты, необходимые только для разработки и не влияющие на работу самого проекта
Например, добавление в проект пакета twig
через Composer будет осуществляться так:
composer require "twig/twig:^2.0"
Команда require
не только загрузит требуемую библиотеку в проект, но и пропишет её добавив информацию о новом пакете в секцию require
файла composer.json
, обнавив его. Если устанавливаемый пакет зависит от других библиотек, то они также будут установлены или обновлены. Кроме этого ещё будет обновлён файл composer.lock
.
Команда require-dev
в Composer предназначена для добавления зависимостей, которые необходимы только в процессе разработки и тестирования вашего приложения в секцию require-dev
:
composer require --dev "twig/twig:^2.0"
Бывают случаи, когда пакет не хочет устанавливаться из-за несовместимости с платформой. В первую очередь надо убедится, что все необходимые ему расширения PHP в системе установлены.
Если же ваша консольная версия PHP использует другие расширения, а сам пакет будет использоваться только с веб-сервером, можно отключить проверку системных требований пакета с помощью опции --ignore-platform-reqs
:
composer require --ignore-platform-reqs vendor/package
Ещё одна ошибка, которую вы можете получить - это не соответствие минимальной стабильности пакета. Все пакеты Composer могут иметь два уровня стабильности:
stable
стабильныйdev
находится в разработке
Уровень стабильности пакета определяет его разработчик. Эта проблема решается чуть сложнее, надо поменять минимальный уровень стабильности для вашего проекта на dev. Откройте файл composer.json
:
nano composer.json
Под имеющийся строчкой License
добавьте следующую строчку:
"minimum-stability": "dev",
Если в файле уже есть строчка minimum-stability
, необходимо заменить её значения со stable
на dev
. После этого вы сможете установить пакет composer, который вам необходим.
Установка всех пакетов из файла composer.json
Установка сразу всех пакетов в проект осуществляется посредством команды:
composer install
Эта команда работает следующим образом:
- Проверяет, имеется ли файл
composer.lock
- Если файл
composer.lock
существует, устанавливает версии указанные в нём - Если файла
composer.lock
нет, тогда выполняетсяcomposer.json
, создаётся файлcomposer.lock
Возьмем для примера вот такой файл:
composer.json{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
"php": ">=5.6.4",
"laravel/framework": "5.3.*"
},
"require-dev": {
"fzaninotto/faker": "~1.4",
"mockery/mockery": "0.9.*",
"phpunit/phpunit": "~5.0",
"symfony/css-selector": "3.1.*",
"symfony/dom-crawler": "3.1.*"
},
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/"
}
},
"autoload-dev": {
"classmap": [
"tests/TestCase.php"
]
},
"scripts": {
"post-root-package-install": [
"php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"php artisan key:generate"
],
"post-install-cmd": [
"Illuminate\\Foundation\\ComposerScripts::postInstall",
"php artisan optimize"
],
"post-update-cmd": [
"Illuminate\\Foundation\\ComposerScripts::postUpdate",
"php artisan optimize"
]
},
"config": {
"preferred-install": "dist"
}
}
Пакеты, которые Composer должен установить перечислены в секциях:
require
указываются пакеты, которые необходимы для работы проектаrequire-dev
указывают пакеты, необходимые только для разработки и не влияющие на работу самого проекта
В секциях указаны, так называемые зависимости. Для каждого пакета указана версия. Composer последовательно устанавливает указанные пакеты и разрешает зависимости уже самих пакетов. У пакетов есть свои зависимости и эти зависимости указываются также в composer.json
самого пакета. Например, посмотрим на исходник пакета fzaninotto/faker, указанного в секции require-dev
. У него в корне можно найти файл
composer.json
, в котором указаны зависимости для этого пакета.
После того, как все пакеты будут установлены, Composer сформирует файл composer.lock
, в котором зафиксирует установленные версии пакетов. Для чего это нужно? Если вы ведёте коллективную разработку, то ваш коллега скачав pull
проект с гит-репозитория должен получить тоже окружение и версии всех пакетов, если у вас в composer.json
версия для пакета жёстко не зафиксирована, а указана через маску:
{
"require": {
"vendor/somepackage": "1.*"
}
}
Например, на момент разработки у вас установлена версия 1.1
, в composer.lock
будет указана версия 1.1
. Тогда ваш коллега при установке получит ту же версию пакета, которая установлена у вас, даже если вышла новая версия 1.2
. Именно поэтому практически всегда проекты имеют файл composer.lock
в репозитории.
Обновление пакетов
Команда update
используется для обновления зависимостей. Она использует только composer.json
. Например, если для пакета указана версия с маской 1.*
или ~2.3.0
или dev-master
Composer проверит есть ли более новая версия в репозитории для установленного пакета и если есть, установит её. И так для каждого пакета. После этого Composer обновит файл composer.lock
.
При установке проекта в случае, если файл composer.lock
отсутствует, команды install
и update
действуют одинаково. Запомните, при первой установке, а также когда вы загрузили из репозитория новую версию вашего проекта, всегда используйте комманду install
, которая проверит изменения в файле composer.lock
. Когда в рабочем проекте нужно установить новые пакеты, обновить установленные или удалить ненужные, понадобится команда
update
. Можно использовать альтернативные команды require
и remove
, которые будут рассмотрены ниже.
Обновление всех пакетов, если удалили пакет из composer.json
, значит он будет деинсталирован:
composer update
Обновление или установка указанных пакетов, если укажите пакет который удалили из composer.json
, значит он будет деинсталирован:
composer update vendor/package
Обновление пакетов разработчика:
composer update --dev
Зависимости require и require-dev
В секции require
указываются пакеты, которые необходимы для работы проекта. Это могут быть комментарии, админка, функции для работы с датами и т.п. В секции require-dev
указывают пакеты, необходимые только для разработки и не влияющие на работу самого проекта.
Можно заметить, что при установке или обновлении Composer устанавливает пакеты из обоих секций. Тогда возникает вопрос, зачем их делить? Это разделение условное и им управляете вы сами. Composer сам не может определить, где он запускается — на сервере разработки или продакшене. Поэтому, при разворачивании проекта на продакшене, нужно указать Composer чтобы он, не устанавливал пакеты для разработки из секции require-dev
.
composer install --no-dev
При обновлении также указывать ключ --no-dev
:
composer update --no-dev