Сценарии
Что такое сценарий?
Сценарий, в терминах Composer, может быть как обратным вызовом PHP (определённым как статический метод), так и любой командой исполняемой из командной строки. Сценарии полезны для выполнения пользовательского кода пакета или пакетно-специфичных команд во время процесса выполнения Composer.
Примечание: Выполняются только сценарии, определённые в корневом пакете в
composer.json. Если зависимость корневого пакета определяет свои сценарии, Composer не выполняет эти дополнительные сценарии.
Имена событий
Composer запускает следующие именованные события во время своего процесса выполнения:
События команд
-
pre-install-cmd: происходит перед выполнением команды
installпри наличии файла блокировки. -
post-install-cmd: происходит после выполнения команды
installпри наличии файла блокировки. -
pre-update-cmd: происходит перед выполнением команды
updateили перед выполнением командыinstallбез файла блокировки. -
post-update-cmd: происходит после выполнения команды
updateили после выполнения командыinstallбез файла блокировки. -
pre-status-cmd: происходит перед выполнением команды
status. -
post-status-cmd: происходит после выполнения команды
status. -
pre-archive-cmd: происходит перед выполнением команды
archive. -
post-archive-cmd: происходит после выполнения команды
archive. -
pre-autoload-dump: происходит перед выгрузкой автозагрузчика, как во время
install/update, так и с помощью командыdump-autoload. -
post-autoload-dump: происходит после выгрузки автозагрузчика, как во время
install/update, так и с помощью командыdump-autoload. -
post-root-package-install: происходит после установки корневого пакета во время команды
create-project(но перед установкой его зависимостей). -
post-create-project-cmd: происходит после выполнения команды
create-project.
События установщика
- pre-operations-exec: происходит перед выполнением операций установки/обновления/.. при установке файла блокировки. Плагины, которым необходимо подключиться к этому событию, должны быть установлены глобально, чтобы быть доступными, так как в противном случае они не будут загружены при первой установке проекта.
События пакета
- pre-package-install: происходит перед установкой пакета.
- post-package-install: происходит после установки пакета.
- pre-package-update: происходит перед обновлением пакета.
- post-package-update: происходит после обновления пакета.
- pre-package-uninstall: происходит перед удалением пакета.
- post-package-uninstall: происходит после удаления пакета.
События плагина
- init: происходит после завершения инициализации экземпляра Composer.
- command: происходит перед выполнением любой команды Composer в командной строке. Он предоставляет доступ к объектам ввода и вывода программы.
-
pre-file-download: происходит перед загрузкой файлов и позволяет манипулировать объектом
HttpDownloaderперед загрузкой файлов на основе URL, который нужно загрузить. - post-file-download: происходит после загрузки файлов распределения пакета и позволяет выполнять дополнительные проверки файла при необходимости.
-
pre-command-run: происходит перед выполнением команды и позволяет манипулировать параметрами объекта
InputInterfaceи аргументами, чтобы настроить поведение команды. - pre-pool-create: происходит перед созданием пула пакетов и позволяет фильтровать список пакетов, которые войдут в решатель.
Примечание: Composer не делает никаких предположений о состоянии ваших зависимостей до
installилиupdate. Поэтому вы не должны указывать сценарии, которые требуют зависимостей, управляемых Composer, в событиях хуковpre-update-cmdилиpre-install-cmd. Если вам нужно выполнить сценарии доinstallилиupdate, убедитесь, что они самодостаточны в вашем корневом пакете.
Определение сценариев
Корневой JSON-объект в composer.json должен иметь свойство "scripts", которое содержит пары именованных событий и соответствующих сценариев каждого события. Сценарии события могут быть определены как строка (только для одного сценария) или массив (для одного или нескольких сценариев).
Для любого данного события:
- Сценарии выполняются в порядке их определения при срабатывании соответствующего события.
- Массив сценариев, связанных с одним событием, может содержать как обратные вызовы PHP, так и команды, исполняемые из командной строки.
- Классы PHP, содержащие определённые обратные вызовы, должны быть загружаемы через механизм автозагрузки Composer.
- Обратные вызовы могут загружать классы только из определений psr-0, psr-4 и classmap. Если определённый обратный вызов полагается на функции, определённые вне класса, то сам обратный вызов отвечает за загрузку файла, содержащего эти функции.
Пример определения сценария:
{
"scripts": {
"post-update-cmd": "MyVendor\\MyClass::postUpdate",
"post-package-install": [
"MyVendor\\MyClass::postPackageInstall"
],
"post-install-cmd": [
"MyVendor\\MyClass::warmCache",
"phpunit -c app/"
],
"post-autoload-dump": [
"MyVendor\\MyClass::postAutoloadDump"
],
"post-create-project-cmd": [
"php -r \"copy('config/local-example.php', 'config/local.php');\""
]
}
} Используя предыдущий пример определения, вот класс MyVendor\MyClass, который может использоваться для выполнения обратных вызовов PHP:
<?php
namespace MyVendor;
use Composer\Script\Event;
use Composer\Installer\PackageEvent;
class MyClass
{
public static function postUpdate(Event $event)
{
$composer = $event->getComposer();
// do stuff
}
public static function postAutoloadDump(Event $event)
{
$vendorDir = $event->getComposer()->getConfig()->get('vendor-dir');
require $vendorDir . '/autoload.php';
some_function_from_an_autoloaded_file();
}
public static function postPackageInstall(PackageEvent $event)
{
$installedPackage = $event->getOperation()->getPackage();
// do stuff
}
public static function warmCache(Event $event)
{
// make cache toasty
}
} Примечание: Во время выполнения Composer install или update команды в среде будет добавлен переменная COMPOSER_DEV_MODE. Если команда была запущена с флагом --no-dev, эта переменная будет установлена в 0, в противном случае — в 1. Переменная также доступна во время выполнения dump-autoload, и она будет установлена так же, как и последняя install или update.
Классы событий
При срабатывании события ваш обратный вызов PHP получает в качестве первого аргумента объект Composer\EventDispatcher\Event. Этот объект имеет метод getName(), который позволяет получить имя события.
В зависимости от типов сценариев, вы получите различные подклассы событий, содержащие различные геттеры с соответствующими данными и связанными объектами:
- Базовый класс:
Composer\EventDispatcher\Event - События команд:
Composer\Script\Event - События установщика:
Composer\Installer\InstallerEvent - События пакета:
Composer\Installer\PackageEvent - События плагина:
- init:
Composer\EventDispatcher\Event - command:
Composer\Plugin\CommandEvent - pre-file-download:
Composer\Plugin\PreFileDownloadEvent - post-file-download:
Composer\Plugin\PostFileDownloadEvent
- init:
Запуск сценариев вручную
Если вы хотите запустить сценарии для события вручную, синтаксис следующий:
php composer.phar run-script [--dev] [--no-dev] script
Например composer run-script post-install-cmd запустит все сценарии post-install-cmd и плагины, которые были определены.
Вы также можете передать дополнительные аргументы обработчику сценария, добавив -- за которым следуют аргументы обработчика. Например, composer run-script post-install-cmd -- --check передаст--check обработчику сценария. Эти аргументы получают как аргументы командной строки обработчиками командной строки, и могут быть получены как массив с помощью $event->getArguments() обработчиками PHP.
Создание пользовательских команд
Если вы добавляете пользовательские сценарии, которые не соответствуют одному из предопределённых имен событий выше, вы можете запустить их с помощью run-script, или также запустить их как родные команды Composer. Например, обработчик, определённый ниже, может быть запущен выполнением composer test:
{
"scripts": {
"test": "phpunit"
}
} Аналогично команде run-script вы можете передавать дополнительные аргументы сценариям, например, composer test -- --filter <pattern> передаст --filter <pattern> сценарию phpunit.
Примечание: Перед выполнением сценариев Composer временно добавляет bin-dir в переменную среды PATH, чтобы двоичные файлы зависимостей были непосредственно доступны. В данном примере, независимо от того, находится ли двоичный файл
phpunitвvendor/bin/phpunitилиbin/phpunit, он будет найден и запущен.
Хотя Composer не предназначен для управления долгоживущими процессами и другими аспектами проектов PHP, иногда бывает удобно отключать тайм-аут процесса для пользовательских команд. Этот тайм-аут по умолчанию равен 300 секундам и может быть переопределён различными способами в зависимости от желаемого эффекта:
- отключить его для всех команд, используя ключ конфигурации
process-timeout, - отключить его для текущих или будущих вызовов composer, используя переменную среды
COMPOSER_PROCESS_TIMEOUT, - для конкретного вызова, используя флаг
--timeoutкомандыrun-script, - используя статический помощник для конкретных сценариев.
Чтобы отключить тайм-аут для определённых сценариев с помощью статического помощника непосредственно в composer.json:
{
"scripts": {
"test": [
"Composer\\Config::disableProcessTimeout",
"phpunit"
]
}
} Чтобы отключить тайм-аут для каждого сценария в данном проекте, вы можете использовать конфигурацию composer.json:
{
"config": {
"process-timeout": 0
}
} Также возможно установить глобальную переменную среды, чтобы отключить тайм-аут всех последующих сценариев в текущей среде терминала:
export COMPOSER_PROCESS_TIMEOUT=0
Чтобы отключить тайм-аут для одного вызова сценария, вы должны использовать команду composer run-script и указать параметр --timeout.
php composer.phar run-script --timeout=0 test
Ссылка на сценарии
Для повышения повторного использования сценариев и избежания дублирования, вы можете вызвать сценарий из другого, добавив префикс @ к имени команды:
{
"scripts": {
"test": [
"@clearCache",
"phpunit"
],
"clearCache": "rm -rf cache/*"
}
} Вы также можете обратиться к сценарию и передать ему новые аргументы:
{
"scripts": {
"tests": "phpunit",
"testsVerbose": "@tests -vvv"
}
} Вызов команд Composer
Для вызова команд Composer вы можете использовать @composer, который будет автоматически резолвиться к текущему используемому composer.phar:
{
"scripts": {
"test": [
"@composer install",
"phpunit"
]
}
} Один из ограничений этого заключается в том, что вы не можете вызвать несколько команд composer подряд, например, @composer install && @composer foo. Вы должны разделить их в JSON-массиве команд.
Выполнение скриптов PHP
Для выполнения скриптов PHP вы можете использовать @php, который будет автоматически резолвиться к текущему используемому процессу PHP:
{
"scripts": {
"test": [
"@php script.php",
"phpunit"
]
}
} Одним из ограничений является то, что вы не можете вызвать несколько команд подряд, например, @php install && @php foo. Необходимо разделить их в JSON-массиве команд.
Вы также можете вызвать скрипт оболочки/bash, в котором будет доступен путь к исполняемому файлу PHP в виде PHP_BINARY переменной окружения.
Настройка переменных окружения
Для настройки переменной окружения в кроссплатформенном режиме можно использовать @putenv:
{
"scripts": {
"install-phpstan": [
"@putenv COMPOSER=phpstan-composer.json",
"composer install --prefer-dist"
]
}
} Пользовательские описания.
Вы можете задать пользовательские описания скриптов следующим образом в вашем composer.json:
{
"scripts-descriptions": {
"test": "Run all tests!"
}
} Эти описания используются в командах composer list или composer run -l для описания действий скрипта при его выполнении.
Примечание: Вы можете задавать пользовательские описания только для пользовательских команд.
© Nils Adermann, Jordi Boggiano
Licensed under the MIT License.
https://getcomposer.org/doc/articles/scripts.md