fi1a/installers

Установка и обновление пакетов через composer для фреймворков

Installs: 68

Dependents: 3

Suggesters: 0

Security: 0

Stars: 0

Watchers: 1

Forks: 0

Open Issues: 0

Type:composer-plugin

2.1.2 2023-03-15 08:20 UTC

This package is auto-updated.

Last update: 2024-10-15 11:42:43 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) необходимо указать путь до папки с 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