Composer run-скрипт вложенных пакетов

#php #laravel #composer-php

#git #композитор-php

Вопрос:

У меня есть проект composer без кода, но со списком зависимостей. Я хочу запустить composer install для загрузки все зависимые пакеты и запустить несколько команд bash в каждом из них после этого.

Мой composer.json:

 {
	"name": "testmain/testmain",
	"description": "testmain",
	"minimum-stability": "dev",
	"repositories": [{
			"type": "package",
			"package": {
				"name": "testsub/testsub1",
				"description": "testsub/testsub1",
				"version": "master",
				"source": {
					"url": "https://github.com/testsub/testsub1",
					"type": "git",
					"reference": "master"
				},
				"scripts": {
					"post-install-cmd": [
						"make",
						"make install"
					]
				}
			}
		},

		{
			"type": "package",
			"package": {
				"name": "testsub/testsub2",
				"description": "testsub/testsub2",
				"version": "master",
				"source": {
					"url": "https://github.com/testsub/testsub2",
					"type": "git",
					"reference": "master"
				},
				"scripts": {
					"post-install-cmd": [
						"make",
						"make install"
					]
				}
			}
		}
	],
	"require": {
		"testsub/testsub1": "master",
		"testsub/testsub2": "master"
	}
}  

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

Спасибо!

Комментарии:

1. Создание плагина composer может быть вашим лучшим вариантом здесь: getcomposer.org/doc/articles/plugins.md#creating-a-plugin

Ответ №1:

К сожалению, невозможно выполнить какие-либо некорневые скрипты (в смысле некорневые composer.json ), как указано в документации:

Примечание: выполняются только сценарии, определенные в composer.json корневого пакета. Если зависимость корневого пакета определяет свои собственные сценарии, Composer не выполняет эти дополнительные сценарии.

Ответ №2:

Как заявил Томас, невозможно автоматически вызывать некорневые скрипты. Но вы можете разрешить пользователю вызывать их вручную. Это применимо не во всех ситуациях, но хорошо в других.

Если у вас есть следующее в vendor/johndoe/mypackage/composer.json :

 "scripts": {
    "nameOfScript": "\johndoe\mypackage\Scripts::invoke"
}
  

В composer.json вашем корневом каталоге поместите следующее:

 "scripts": {
    "myFancyScript": [
        "@putenv COMPOSER=vendor/johndoe/mypackage/composer.json",
        "@composer nameOfScript"
    ]
}
  

Затем пользователь может вызвать composer myFancyScript из вашего корневого каталога, и статическая функция invoke() в пакете johndoe/mypackage выполняется.