fi1a/installers

通过 composer 为框架安装和更新包

安装: 68

依赖者: 3

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

类型:composer-plugin

2.1.2 2023-03-15 08:20 UTC

This package is auto-updated.

Last update: 2024-09-15 11:28:59 UTC


README

Latest Version Software License PHP Version Coverage Status Total Downloads Support mail

这个库通过 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 是要安装的模块的标识符。

安装和删除包的支持

库中的类用于确定是否可以安装或删除包(方法 canInstallcanUninstall)。还包含在安装、删除或更新包时调用的方法(方法 installuninstallupdate)。

库类必须位于 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