我正在尝试通过 cli 运行自定义作曲家脚本,如下所示:
composer custom_script_cli --custom_argument
发生的情况是作曲家认为我在问作曲家是否要将该参数传递给作曲家而不是自定义脚本。
有没有办法在不强行将其添加到自定义脚本本身的情况下执行此操作?
我发现唯一与此主题相关的是 2013 年的 git 问题,当时说这是不可能的。不确定4年后是否仍然如此。
任何类型的参数都可以简单地传递给自定义作曲家脚本 像往常一样将它们附加到命令行上,但在--
之后 (即特殊的参数分隔运算符,它不会传递给脚本本身)。
但是,您不需要使用--
参数分隔运算符 当没有任何参数以任何连字符开头时 (即通常称为命令行选项,如-o
或--option
) 否则composer
会将它们视为composer
自身的选择,而不是脚本。
如果自定义脚本定义运行多个命令,则传递的参数将附加到每个命令。此外,您不能使用 shell 编程约定(如$2
)来引用单个参数。
如果自定义脚本由回调处理,则脚本负责分析参数中的选项。从回调的角度来看,-c
和--option=B
是参数。
例
给定包含以下内容的composer.json
:
{
"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"
]
}
}
并给定一个包含以下内容的文件MyClass.php
:
<?php
namespace MyVendor;
use ComposerScriptEvent;
use ComposerInstallerPackageEvent;
class MyClass {
public static function myCallback(Event $event) {
var_dump($event->getArguments());
}
}
第 0 步:转储自动加载机以识别 MyClass
$ composer dump-autoload
Generating autoload files
测试 1:显示没有参数分隔运算符会发生什么情况
$ composer pass-args-to-callback A --option=B -C
[SymfonyComponentConsoleExceptionRuntimeException]
The "--option" option does not exist.
pass-args-to-callback [--dev] [--no-dev] [--] [<args>]...
测试 2:显示参数和选项在回调中的显示方式
$ composer pass-args-to-callback -- A --option=B -C
> MyVendorMyClass::myCallback
array(3) {
[0]=>
string(1) "A"
[1]=>
string(10) "--option=B"
[2]=>
string(2) "-C"
}
测试 3:显示如何将参数和选项追加到命令
$ 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
参考: https://getcomposer.org/doc/articles/scripts.md
您可以在脚本条目的末尾添加双破折号--
。
这样,您可以将其他参数/选项传递给基础脚本。
{
"scripts": {
"test": "phpunit",
"test-single": "phpunit --"
}
}
要使用自定义 phpunit 过滤器运行test-single
脚本,请执行以下操作:
composer test-single --filter test_function
你可以在最后传递参数,这样:
composer custom_script_cli [--dev] [--no-dev] [--] [<args>]...
这意味着这样的事情
composer custom_script_cli argument1 argument2
然后你可以在你的脚本中得到它,就像这样:
public static function commandcode(Event $event) {
$event->getArguments(); ...
}
您引用的内容称为选项。