Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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!

like image 886
adiv Avatar asked Oct 16 '17 11:10

adiv


2 Answers

Unfortunately, it is not possible to execute any non-ROOT scripts (in meaning non-root composer.json), as mentioned in documentation:

Note: Only scripts defined in the root package's composer.json are executed. If a dependency of the root package specifies its own scripts, Composer does not execute those additional scripts.

like image 194
Tomas Votruba Avatar answered Sep 29 '22 01:09

Tomas Votruba


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.

like image 22
Peter Avatar answered Sep 29 '22 01:09

Peter