"key: value"语法在作曲家脚本中有什么作用



从compser文档中可以编写如下脚本:

{
"scripts": {
"some-event": [
"command1",
"command2",
"command3"
],
}
}

但是在Symfony中,我发现了一个稍微不同的语法,而不是一个列表,使用一个键:值对,像这样:

{
"scripts": {
"auto-scripts": {
"cache:clear": "symfony-cmd",
"assets:install %PUBLIC_DIR%": "symfony-cmd"
},
},
}

这个语法究竟是如何工作的?它是否将命令重定向到另一个命令,在两个命令之间添加依赖关系或其他?

这种语法究竟是如何工作的?

此语法在Composer中未定义。

要了解更多信息,请删除它,然后检查哪个组件断开了。然后咨询该/这些组件的支持以了解更多信息(和/或在这里留下评论)。

它是否将命令重定向到另一个命令,在两个命令之间添加依赖关系或其他?

如上所述,这是未定义的。只要你关心Composer,你可以检查它是否被识别为脚本:

composer run-script --list

您可能会看到auto-scripts被列为脚本,也就是说,Composer至少可以识别auto-scripts关键字。

然后您可以执行该脚本,以查看Composer如何执行它(强烈建议您这样做,并在孤立的环境中执行以下操作):

composer run-script auto-scripts

查看插件是否会产生影响,你也可以在禁用插件的情况下执行它:

composer --no-plugins run-script auto-scripts

照顾。

和作曲家总是有-vvv


关于Composer内部配置文件处理的一些注意事项:JSON Composer中的文本文件(.json,.lock)通常被解析为关联数组(而不是stdClass::class对象)。

因此,foreach是一个脚本成员——它也可以是一个字符串,可能是(array)强制转换的后期处理——将不关心键(属性名),只执行脚本行。

此语法由symfony/flex插件使用,仅在auto-scripts密钥下有效。flex中的代码是这样的:

$json = new JsonFile(Factory::getComposerFile());
$jsonContents = $json->read();
$executor = new ScriptExecutor($this->composer, $this->io, $this->options);
foreach ($jsonContents['scripts']['auto-scripts'] as $cmd => $type) {
$executor->execute($type, $cmd);
}

使用以下代码处理execute:

switch ($type) {
case 'symfony-cmd':
return $this->expandSymfonyCmd($cmd);
case 'php-script':
return $this->expandPhpScript($cmd);
case 'script':
return $cmd;
default:
throw new InvalidArgumentException();
}

最新更新