fi1a / installers
Установка и обновление пакетов через composer для фреймворков
Installs: 68
Dependents: 3
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
Type:composer-plugin
Requires
- php: ^7.3 || ^8
- composer-plugin-api: ^2.3
- ext-mbstring: *
- fi1a/console: ^2.0
- fi1a/format: ^2.0
Requires (Dev)
- captainhook/captainhook: ^5.4
- composer/composer: ^2.4
- phpunit/phpunit: ^9.3
- slevomat/coding-standard: ^6.3
- squizlabs/php_codesniffer: ^3.5
- vimeo/psalm: ^4.3
Provides
README
Эта библиотека осуществляет установку, обновление и удаление пакетов на основе типа через composer для фреймворков. Имеется возможность настроить путь установки для каждого пакета. Помимо размещения по нужному пути осуществляется установка пакета в фреймворке, если устанавлевыемый пакет поддерживает это.
Поддерживаемые типы пакетов
Пример composer.json файла
В файле composer.json необходимо указать тип пакета "type": "bitrix-d7-module" и подключить пакет «require»: { "fi1a/installers": "^2.0" }.
{ "name": "foo/bar", "type": "bitrix-d7-module", "require": { "fi1a/installers": "^2.0" } }
Это установит ваш пакет в папку с модулями 1С-Битрикс, когда пользователь запустит установку.
Пользовательские пути установки
Доступные переменные для использования в путях: {{vendor}}, {{name}}.
Вы можете указать путь для установки в composer.json
для пакетов:
{ "extra": { "installer-paths": { "bitrix/modules/{{vendor}}.{{name}}": ["foo/bar", "baz/qux"] } } }
Вы можете указать путь для установки в composer.json
для определенных типов пакетов:
{ "extra": { "installer-paths": { "bitrix/modules/{{vendor}}.{{name}}": ["type:bitrix-d7-module"] } } }
Вы можете указать путь для установки в composer.json
для определенного vendor:
{ "extra": { "installer-paths": { "bitrix/modules/{{vendor}}.{{name}}": ["vendor:foo"] } } }
Установка через composer модуля 1С-Битрикс (тип пакета bitrix-d7-module)
Для установки модуля 1С-Битрикс (тип пакета bitrix-d7-module
) необходимо указать путь до папки с 1С-Битрикс в
вашем composer.json
файле проекта, после чего выполнить установку пакета через composer require
,
предварительно выполнив composer require fi1a/installers
.
{ "extra": { "bitrix-dir": "../bitrix" } }
composer require fi1a/installers composer require foo/bar
После копирования файлов модуля, выставляется флаг в параметрах модулей битрикс, который означает установку модуля через composer. Получить значение можно таким образом:
\Bitrix\Main\Config\Option::get('fi1a.installers', 'YOUR_MODULE.ID') === 'Y';
где YOUR_MODULE.ID
, идентификатор устанавливаемого модуля.
Поддержка установки и удаления пакета
Класс библиотеки используется для определения возможности установки или удаления пакета (методы canInstall
и canUninstall
).
Также содержит методы вызываемые при установке, удалении или обновлении пакета (методы install
, uninstall
и update
).
Класс библиотеки должен располагаться по пути installers/Library.php
, иметь название
Fi1a\Installers\{{Vendor}}{{Name}}\Library
и реализовывать интерфейс Fi1a\Installers\LibraryInterface
.
Пример класса библиотеки для типа пакета bitrix-d7-module
:
<?php declare(strict_types=1); namespace Fi1a\Installers\Fi1aBitrixd7moduleinstallerdemo; use Bitrix\Main\Config\Option; use CModule; use ErrorException; use Fi1a\Console\IO\InputInterface; use Fi1a\Console\IO\OutputInterface; use Fi1a\Installers\AbstractLibrary; use Fi1a\Installers\Version; use Fi1a\Installers\VersionInterface; /** * Библиотека */ class Library extends AbstractLibrary { public const MODULE_ID = 'fi1a.bitrixd7moduleinstallerdemo'; /** * @inheritDoc */ public function __construct(OutputInterface $output, InputInterface $stream) { parent::__construct($output, $stream); $this->includeBitrix(); } /** * @inheritDoc */ public function canInstall(): bool { return true; } /** * @inheritDoc */ public function canUninstall(): bool { return true; } /** * @inheritDoc */ public function install(): bool { $this->output->writeln('<notice>Library->install</notice>'); return true; } /** * @inheritDoc */ public function uninstall(): bool { $this->output->writeln('<notice>Library->uninstall</notice>'); return true; } /** * @inheritDoc */ public function update(): bool { $this->output->writeln('<notice>Library->update</notice>'); /** * @var \fi1a_bitrixd7moduleinstallerdemo|false $module * @psalm-suppress UnusedVariable */ $module = CModule::CreateModuleObject(self::MODULE_ID); if ($module) { // @codingStandardsIgnoreStart Option::set(self::MODULE_ID, 'version', (string) $module->MODULE_VERSION); // @codingStandardsIgnoreEnd } return true; } /** * @inheritDoc */ public function getCurrentVersion(): VersionInterface { [$major, $minor, $build] = explode( '.', (string) Option::get(self::MODULE_ID, 'version', '1.0.0') ); return new Version((int) $major, (int) $minor, (int) $build); } /** * @inheritDoc */ public function getUpdateVersion(): VersionInterface { /** * @var \fi1a_bitrixd7moduleinstallerdemo|false $module */ $module = CModule::CreateModuleObject(self::MODULE_ID); if (!$module) { throw new ErrorException(sprintf('Модуль "%s" не найден', self::MODULE_ID)); } // @codingStandardsIgnoreStart [$major, $minor, $build] = explode( '.', (string) $module->MODULE_VERSION ); // @codingStandardsIgnoreEnd return new Version((int) $major, (int) $minor, (int) $build); } /** * Подключить битрикс */ private function includeBitrix(): void { $_SERVER['DOCUMENT_ROOT'] = realpath(__DIR__ . '/../../../..'); defined('NO_KEEP_STATISTIC') || define('NO_KEEP_STATISTIC', true); defined('NOT_CHECK_PERMISSIONS') || define('NOT_CHECK_PERMISSIONS', true); defined('BX_WITH_ON_AFTER_EPILOG') || define('BX_WITH_ON_AFTER_EPILOG', true); defined('BX_NO_ACCELERATOR_RESET') || define('BX_NO_ACCELERATOR_RESET', true); /** * @psalm-suppress UnresolvableInclude */ require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php'; } }
Поддержка обновления пакета
При обновлении пакета осуществляется поиск файлов версий обновлений и последовательный запуск их.
Файлы с версиями для обновления расположены по пути installers/versions
(0.1.0, 1.2.0, ...) вашего пакета.
Класс должен иметь имя Fi1a\Installers\{{Vendor}}{{Name}}\Versions\Version{{Major}}_{{Minor}}_{{Build}}\UpdateVersion
,
реализовывать интерфейс Fi1a\Installers\UpdateVersionInterface
и располагаться по пути installers/versions/{{Major}}.{{Minor}}.{{Build}}/UpdateVersion.php
Пример:
<?php declare(strict_types=1); namespace Fi1a\Installers\Fi1aBitrixd7moduleinstallerdemo\Versions\Version1_1_0; use Fi1a\Installers\AbstractUpdateVersion; /** * Обновление версии 1.1.0 */ class UpdateVersion extends AbstractUpdateVersion { /** * @inheritDoc */ public function update(): bool { require __DIR__ . '/updater.php'; $this->output->writeln('UpdateVersion->update 1.1.0'); return true; } }
Пример расположен по пути installers/versions/1.1.0/UpdateVersion.php