Установка пакета без дополнительной настройки. Как это звучит? Symfony решила эту проблему с помощью удивительного пакета symfony/flex. Composer Synchronizer — будущая альтернатива любому другому фреймворку.

Для тех, кто не знает, пакет Symfony/Flex просто устанавливает и настраивает все необходимое во время установки пакета. Поскольку мне когда-то не хватало этой классной функции при работе с разными фреймворками, я решил создать решение, которое можно было бы использовать в любом другом фреймворке.

Сначала небольшой пример

Допустим, вы используете одну из поддерживаемых платформ, таких как Nette Framework, CakePhp или Yii framework, и не хотите устанавливать пакет.

В следующем примере я использую Nette Framework и решил установить пакет machy8/webloader. Чтобы все заработало, мне нужно сделать 3 шага: Установить синхронизатор, настроить проект и установить выбранный пакет.

(Для CakePhp вы также можете попробовать его с пакетом cakephp/elastic-search:1.5.0, а для платформы Yii с пакетом yiisoft/yii2-twig:2.2.0).

1. Установка синхронизатора

composer require composer-synchronizer/composer-synchronizer

(Для фреймворков CakePhp и Yii необходимо использовать версию @dev, поскольку синхронизаторы для этих фреймворков пока доступны только в основной ветке.)

2. Настройка проекта
Необходимая минимальная настройка — это просто установка типа проекта (для каждого фреймворка свой) используемого вами фреймворка в дополнительном разделе файла composer.json в корне вашего проекта. каталог.

(Тип проекта для CakePhp — cakePhp, а для платформы Yii — yii.)

"extra": {
    "composer-synchronizer": {
        "project-type": "nette"
    }
}

3. Установка пакета

composer require machy8/webloader

Вот и все. Во время установки минимальная правильная конфигурация была скопирована в каталог конфигурации и каталог webtemp с файлом gitignore. был создан. Теперь я могу использовать его без каких-либо настроек.

Примечание
В зависимости от используемой вами платформы во время первой установки синхронизатор выполняет процессы инициализации, такие как копирование необходимых файлов в соответствующие места.

(См. документацию по CakePhp и Yii framework.)

Как это работает?

Во время установки синхронизатор ищет тип проекта в файле composer.json в дополнительном разделе. Если установлен тип проекта, то синхронизатор включен, и если установлен какой-либо пакет, содержащий конфигурацию синхронизатора (локальный или удаленный), синхронизатор будет обрабатывать разделы конфигурации, чтобы, он мог, например, копировать файлы, создавать каталоги, обновить корневой файл проекта .gitignore и т. д..

Как упоминалось выше, конфигурация может быть локальной (предпочтительной), то есть она поставляется непосредственно с установленным пакетом или удаленной. Возможность добавить удаленную конфигурацию в репозиторий Github предназначена для тех пакетов, автор которых не добавил конфигурацию, но вы все равно хотите ее использовать 😃.

Должен ли я добавить конфигурацию в свой пакет?

да. Почему? Потому что вы можете предоставить минимальную конфигурацию для вашего пакета напрямую, и это может упростить установку всего пакета.

Как я могу настроить свой пакет?

Если вы хотите настроить свой пакет, вам необходимо прочитать документацию для вашего синхронизатора фреймворка.

Также смотрите примеры конфигурации и используйте игровую площадку для разработки и тестирования конфигурации.

Примеры конфигурации:
Удаленно — для пакета Webloader:

{
    "resources": {
        "webloader.neon": "%configDir%/webloader/",
        "webtemp/": "%wwwDir%/webtemp/"
    },
    "includes": [
        "webloader/webloader.neon"
    ]
}

Локальный — используется в пакете machy8/macdom:

"composer-synchronizer": {
    "nette2": {
        "resources": {
            "composer-synchronizer/nette2/": "%configDir%/macdom/"
        },
        "includes": [
            "macdom/macdom.neon"
        ]
    }
}

Синхронизатор для моего любимого фреймворка отсутствует!

Несколько простых шагов, один пулреквест и синхронизатор для вашего любимого фреймворка готов! [Документация] содержит необходимую информацию для разработки синхронизатора и примером может служить синхронизатор Nette. Минимальный синхронизатор без каких-либо дополнительных функций может выглядеть так:

final class Nette2Synchronizer extends AbstractSynchronizer
{
    private const CONFIGURATION_FILE = 'composer-synchronizer.neon';
    private const CONFIGURATION_FILE_INDENTATION_CHARACTER = "\t";
    private const PATHS_PLACEHOLDERS = [
        'appDir' => 'app',
        'configDir' => 'app/config',
        'logDir' => 'log',
        'tempDir' => 'temp',
        'wwwDir' => 'www',
    ];
    public static function getAliases(): array
    {
        return ['nette'];
    }
    public static function getVersionedName(): string
    {
        return 'nette2';
    }
    protected function getPathsPlaceholders(): array
    {
        return self::PATHS_PLACEHOLDERS;
    }
}

Дайте мне знать, что вы думаете!

Первоначально опубликовано на machy8.com.