zikwall
@zikwall

Как при установке пакета из Github создавать директорию?

Добрый день!

Не могу разобраться, нужно создать программно директории при установке определенного пакета. Есть некоторые модули и есть один базовый модуль (vendor/username/core), внутри которого в папке ( ..repo../modules) должны находиться те самые некоторые модули.

У меня есть кастомный инсталяттор, он прекрасно работает(устанавливает пакеты в определенные директории по типу этого пакета), но проблема в том, что все эти некоторые модули идут в зависимостях в базовом модуле и должны храниться ВНУТРИ него и посему при установке:

composer require username/core

они идут в разнобой, т.е могут установиться раньше базового модуля:
- installing module1
- installing module2
- installing core
- installing moduleN

Соответственно те, что установились раньше базового модуля не будут установлены, как решить это, я добавил новый класс в инсталлятор:
/**
 * <code>
 * "extra": {
 * "encore-composer-mkdir": [
 *  "vendor/username/core/modules",
 *  "folder2/folde22"
 *  ]
 * }
 * </code>
 *
 */
class ScriptHandlerHelper
{
    public static function mkdirs(Event $event)
    {
        $extras = $event->getComposer()->getPackage()->getExtra();
        if (! isset($extras['composer-mkdir'])) {
            $message = 'The mkdir handler needs to be configured through the extra.composer-mkdir setting.';
            throw new InvalidArgumentException($message);
        }
        if (! is_array($extras['composer-mkdir'])) {
            $message = 'The extra.composer-mkdir setting must be an array.';
            throw new InvalidArgumentException($message);
        }
       
        $legacy = array_filter($extras['composer-mkdir'], function ($directory) {
            return !is_string($directory);
        });
        if (!empty($legacy)) {
            $message = 'Since 2.0, mode is no longer supported. See UPGRADE-2.0.md for further details.';
            throw new InvalidArgumentException($message);
        }
       
        $directories = array_filter($extras['composer-mkdir'], function ($directory) {
            return !file_exists($directory);
        });
        foreach ($directories as $directory) {
            mkdir($directory, 0777, true);
        }
    }
}


и в composer.json инсталлятора(я правильно сделал??) прописал:
"scripts": {
		"post-package-install": [
			//МБ это вариант?
		],
		"post-install-cmd": [
			"username\\CustomInstaller\\ScriptHandlerHelper::mkdirs"
		],
		"post-update-cmd": [
			"username\\CustomInstaller\\ScriptHandlerHelper::mkdirs"
		]
	},
	"extra": {
		"composer-mkdir": [
			"vendor/username/core/modules" - данные пути должны создаться
		]
	},


Но реакции никакой, как правильно создавать директории при установке?
Прошу прощения за многоватость текста :)
  • Вопрос задан
  • 45 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы