'Composer run-script of nested packages

I have composer project without code but with list of dependencies. I want to run composer install for download all dependent packages and run some bash commands into each one after it.

My 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"
	}
}

The problem is in running scripts sequence of nested packages, all scripts are ignored by composer.

Thanks!



Solution 1:[1]

As Tomas stated, it is not possible to automatically call non-ROOT scripts. But you can enable the user to call them manually. This is not applicable in all situations, but good in others.

If you have the following in vendor/johndoe/mypackage/composer.json:

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

In the composer.json of your root directory put the following:

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

Then the user can call composer myFancyScript from your root directory and the static function invoke() in the package johndoe/mypackage is executed.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Peter