fi1a / installers
通过 composer 为框架安装和更新包
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),需要在项目的 composer.json 文件中指定 1С-Битрикс 文件夹的路径,然后执行 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