Настройка и использование настраиваемых инсталляторов

  1. Сводка
  2. Вызов пользовательского установщика
  3. Создание установщика
    1. composer.json
    2. Класс плагина
    3. Класс Custom Installer

Сводка #

Иногда может потребоваться, чтобы пакет требовал дополнительных действий во время установки, таких как установка пакетов за пределами стандартной библиотеки vendor.

В этих случаях вы могли бы рассмотреть создание Custom Installer для обработки вашей конкретной логики.

Вызов пользовательского установщика #

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

Инструкции по созданию настраиваемых установщиков см. в следующей главе.

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

Пример использования:

phpDocumentor показывает шаблоны, которые необходимо установить за пределами структуры папок default/vendor. В качестве такового они выбрали тип phpdocumentor-template и создали плагин, предоставляющий Custom Installer для отправки этих шаблонов в нужную папку.

Примером composer.json такого пакета шаблонов будет:

{
 "name": "phpdocumentor/template-responsive",
 "type": "phpdocumentor-template",
 "require": {
 "phpdocumentor/template-installer-plugin": "*"
 }
}
ВАЖНО: чтобы убедиться, что программа установки шаблонов присутствует во время установки пакета шаблонов, в пакетах шаблонов должен быть установлен плагин.

Создание установщика #

Пользовательский установщик определяется как класс, который реализует Composer\Installer\InstallerInterface и обычно распространяется в модуле Composer.

Таким образом, базовый Installer Plugin будет состоять из трех файлов:

  1. Пакетный файл: composer.json
  2. Класс плагина, например: My\Project\Composer\Plugin.php, содержащий класс, который реализует Composer\Plugin\PluginInterface.
  3. Класс Installer, например: My\Project\Composer\Installer.php, содержащий класс, который реализует Composer\Installer\InstallerInterface.

composer.json #

Файл пакета такой же, как и любой другой файл пакета, но со следующими требованиями:

  1. Атрибут type должен быть composer-plugin.
  2. Атрибут extra должен содержать элемент class, определяющий имя класса плагина (включая пространство имен). Если пакет содержит несколько плагинов, это может быть массив имен классов.

Пример:

{
 "name": "phpdocumentor/template-installer-plugin",
 "type": "composer-plugin",
 "license": "MIT",
 "autoload": {
 "psr-0": {"phpDocumentor\\Composer": "src/"}
 },
 "extra": {
 "class": "phpDocumentor\\Composer\\TemplateInstallerPlugin"
 },
 "require": {
 "composer-plugin-api": "^1.0"
 },
 "require-dev": {
 "composer/composer": "^1.3"
 }
}

В приведенном выше примере есть сам Composer в своем require-dev, который позволяет вам использовать классы Composer в вашем тестовом наборе, например.

Класс плагина #

Класс, определяющий плагин Composer, должен реализовывать Composer\Plugin\PluginInterface. Затем он может зарегистрировать Custom Installer в своем методе activate ().

Класс может быть размещен в любом месте и иметь любое имя, если оно самозагружаемо и соответствует элементу extra.class в определении пакета.

Пример:

getInstallationManager()->addInstaller($installer);
 }
}

Пользовательский класс установщика #

Класс, который выполняет пользовательскую установку, должен реализовать Composer\Installer\InstallerInterface (или расширить другой установщик, который реализует этот интерфейс). Он определяет строку типа, поскольку он будет распознан пакетами, которые будут использовать этот установщик в методе supports ().

ПРИМЕЧАНИЕ. Внимательно выберите название своего типа, рекомендуется придерживаться формата: vendor-type. Например: phpdocumentor-template.

Класс InstallerInterface определяет следующие методы (см. Источник точной подписи):

  • supports (), здесь вы проверяете, соответствует ли переданный тип имени, объявленному для этого установщика (см. Пример).
  • isInstalled (), определяет, установлен ли поддерживаемый пакет.
  • install (), здесь вы можете определить действия, которые должны быть выполнены при установке.
  • update (), здесь вы определяете поведение, которое требуется, когда Composer вызывается с аргументом update.
  • uninstall (), здесь вы можете определить действия, которые необходимо выполнить, когда пакет необходимо удалить.
  • getInstallPath (), этот метод должен возвращать местоположение, в которое должен быть установлен пакет, относительно местоположения composer.json.

Пример:

getPrettyName(), 0, 23);
 if ('phpdocumentor/template-' !== $prefix) {
 throw new \InvalidArgumentException(
 'Unable to install template, phpdocumentor templates '
 .'should always start their package name with '
 .'"phpdocumentor/template-"'
 );
 }

 return 'data/templates/'.substr($package->getPrettyName(), 23);
 }

 /**
 * {@inheritDoc}
 */
 public function supports($packageType)
 {
 return 'phpdocumentor-template' === $packageType;
 }
}

Этот пример демонстрирует, что довольно просто расширить класс Composer\Installer\LibraryInstaller, чтобы удалить префикс (phpdocumentor/template-), а оставшуюся часть использовать для сборки совершенно другого пути установки.

Вместо установки в /vendor любой пакет, установленный с помощью этого установщика, будет помещен в папку /data/templates/.