I'm trying to run a custom composer script via cli like so:
composer custom_script_cli --custom_argument
What happens is composer thinks i'm asking composer if i want to pass that argument to composer instead of the custom script.
Is there a way to do this without forcefully adding it to the custom script itself?
Only thing I found relevant to this topic was a git issue from 2013 which at that time says it's not possible. Not sure if this is still the case 4 years later.
Composer is a tool for dependency management in PHP. It allows you to declare the libraries your project depends on and it will manage (install/update) them for you.
The require command adds new packages to the composer.json file from the current directory. If no file exists one will be created on the fly. After adding/changing the requirements, the modified requirements will be installed or updated.
A script, in Composer's terms, can either be a PHP callback (defined as a static method) or any command-line executable command. Scripts are useful for executing a package's custom code or package-specific commands during the Composer execution process. Note: Only scripts defined in the root package's composer.
Any kind of arguments may be passed to custom-composer-scripts simply
by appending them on the command-line as usual but after a --
(i.e. the special argument separation operator, which is not passed to the scripts itself).
However, you do not need to use the --
argument separation operator
when NONE of the arguments begin with any hyphens
(i.e. what are generally called command-line options, like -o
or --option
)
else composer
would treat them as an option to composer
itself, and not to the script.
If the custom script definition runs multiple commands then the arguments passed will appended to every command. Also you can't use shell programming conventions like $2
to refer to individual arguments.
If the custom script is handled by a callback, it is the script's responsibility to parse options from arguments. From the callback's perspective things like -c
and --option=B
are arguments.
Given a composer.json
with the following contents:
{
"autoload": { "psr-4": { "MyVendor\\": "./" } },
"scripts": {
"pass-args-to-callback": [
"MyVendor\\MyClass::myCallback"
],
"pass-args-to-commands": [
"echo one",
"echo two",
"@other-command"
],
"other-command": [
"echo three"
]
}
}
And given a file MyClass.php
with the following contents:
<?php
namespace MyVendor;
use Composer\Script\Event;
use Composer\Installer\PackageEvent;
class MyClass {
public static function myCallback(Event $event) {
var_dump($event->getArguments());
}
}
$ composer dump-autoload
Generating autoload files
$ composer pass-args-to-callback A --option=B -C
[Symfony\Component\Console\Exception\RuntimeException]
The "--option" option does not exist.
pass-args-to-callback [--dev] [--no-dev] [--] [<args>]...
$ composer pass-args-to-callback -- A --option=B -C
> MyVendor\MyClass::myCallback
array(3) {
[0]=>
string(1) "A"
[1]=>
string(10) "--option=B"
[2]=>
string(2) "-C"
}
$ composer pass-args-to-commands -- A --option=B -C
> echo one 'A' '--option=B' '-C'
one A --option=B -C
> echo two 'A' '--option=B' '-C'
two A --option=B -C
> echo three 'A' '--option=B' '-C'
three A --option=B -C
Reference: https://getcomposer.org/doc/articles/scripts.md
You may add the double dashes --
to the end of your script entry(s).
This way you can pass additional arguments/options to the underlying script.
{
"scripts": {
"test": "phpunit",
"test-single": "phpunit --"
}
}
To run the test-single
script with a custom phpunit filter:
composer test-single --filter test_function
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With