Скрипты

  1. Что такое скрипт?
  2. Названия событий
    1. Командные события
    2. События установщика
    3. События пакета
    4. События плагина
  3. Определение скриптов
  4. Классы событий
  5. Запуск скриптов вручную
  6. Написание пользовательских команд
  7. Ссылочные скрипты
  8. Вызов команд Composer
  9. Выполнение скриптов PHP

Что такое скрипт? #

Сценарий в терминах Composer может быть либо обратным вызовом PHP (определенным как статический метод), либо любой выполняемой командой командной строки. Сценарии полезны для выполнения настраиваемого кода пакета или команд, специфичных для пакета, во время выполнения компоновщика.

Примечание. Выполняются только скрипты, определенные в composer.json корневого пакета. Если зависимость корневого пакета указывает его собственные сценарии, Composer не выполняет эти дополнительные сценарии.

Имена событий #

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

Командные события #

  • pre-install-cmd: происходит до того, как команда install будет выполнена с имеющимся файлом блокировки.
  • post-install-cmd: возникает после того, как команда install была выполнена с присутствующим файлом блокировки.
  • pre-update-cmd: происходит до выполнения команды update или до выполнения команды install без наличия файла блокировки.
  • post-update-cmd: происходит после выполнения команды update или после того, как команда install была выполнена без присутствия файла блокировки.
  • 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-dependencies-solving: происходит до разрешения зависимостей.
  • post-dependencies-solving: происходит после устранения зависимостей.

События пакета #

  • pre-package-install: происходит до установки пакета.
  • post-package-install: происходит после установки пакета.
  • pre-package-update: происходит до обновления пакета.
  • post-package-update: происходит после обновления пакета.
  • pre-package-uninstall: происходит до удаления пакета.
  • post-package-uninstall: происходит после удаления пакета.

События плагина #

  • init: происходит после инициализации экземпляра Composer.
  • command: встречается перед выполнением любой команды Composer Command на CLI. Он предоставляет вам доступ к входным и выходным объектам программы.
  • pre-file-download: происходит до загрузки файлов и позволяет вам манипулировать объектом RemoteFilesystem до загрузки файлов на основе загружаемого URL.
Примечание: 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:

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_DEV_MODE. Если команда была запущена с флагом --no-dev, эта переменная будет установлена ​​в 0, в противном случае она будет установлена ​​в 1.

Классы событий #

Когда событие вызывается, ваш обратный вызов PHP получает в качестве первого аргумента объект Composer\EventDispatcher\Event. Этот объект имеет метод getName(), который позволяет вам получить имя события.

В зависимости от типов скриптов вы получите различные подклассы событий, содержащие различные геттеры с соответствующими данными и связанными с ними объектами:

Запуск скриптов вручную #

Если вы хотите вручную запускать скрипты для события, синтаксис:

composer run-script [--dev] [--no-dev] script

Например, сценарий composer run-script post-install-cmd будет запускать все сценарии post-install-cmd, которые были определены.

Вы также можете предоставить дополнительные аргументы обработчику сценария путем добавления -- за ним следуют аргументы обработчика, например composer run-script post-install-cmd -- --check пройдет --check вместе с обработчиком сценария. Эти аргументы поступают как CLI arg с помощью обработчиков CLI и могут быть получены как массив через $event->getArguments() обработчиками PHP.

Написание пользовательских команд #

Если вы добавляете пользовательские сценарии, которые не соответствуют одному из заранее определенных имен событий, вы можете либо запустить их с помощью сценария run, либо запустить их как собственные команды Composer. Например, обработчик, определенный ниже, может быть выполнен простым выполнением composer test:

{
 "scripts": {
 "test": "phpunit"
 }
}
Примечание. Перед выполнением скриптов bin-dir Composer временно помещается поверх переменной окружения PATH, чтобы бинарные файлы зависимостей были легко доступны. В этом примере, независимо от того, находится ли бинарный файл phpunit на самом деле в vendor/bin/phpunit или bin/phpunit, он будет найден и выполнен.

Ссылочные скрипты #

Чтобы включить повторное использование сценария и избежать дублирования, вы можете вызывать скрипт из другого путем префикса имени команды с @:

{
 "scripts": {
 "test": [
 "@clearCache",
 "phpunit"
 ],
 "clearCache": "rm -rf cache/*"
 }
}

Вызов команд Composer #

Чтобы вызвать команды Composer, вы можете использовать @composer, который автоматически разрешит то, что в данный момент используется composer.phar:

{
 "scripts": {
 "test": [
 "@composer install",
 "phpunit"
 ]
 }
}

Одним из ограничений этого является то, что вы не можете вызывать несколько команд композитора в строке, например, @composer install && @composer foo. Вы должны разбить их в массиве JSON команд.

Выполнение сценариев PHP #

Для выполнения PHP-скриптов вы можете использовать @php, который автоматически разрешит любой php-процесс, используемый в данный момент:

{
 "scripts": {
 "test": [
 "@php script.php",
 "phpunit"
 ]
 }
}

Одним из ограничений этого является то, что вы не можете вызывать несколько команд в строке, например @php install && @php foo. Вы должны разбить их в массиве JSON команд.