如何从命令行将参数传递给作曲家脚本?

2022-08-30 18:28:40

我正在尝试通过cli运行自定义作曲家脚本,如下所示:

composer custom_script_cli --custom_argument

发生的事情是作曲家认为我在问作曲家,我是否想把这个参数传递给作曲家而不是自定义脚本。

有没有办法在不强制将其添加到自定义脚本本身的情况下执行此操作?

我发现与这个主题相关的唯一一件事是2013年的git问题,当时说这是不可能的。不确定4年后是否仍然如此。


答案 1

任何类型的参数都可以传递给自定义作曲家脚本,只需像往常一样将它们附加到命令行上,但要放在之后(即特殊的参数分离运算符,它不会传递给脚本本身)。--

但是,当没有一个参数以任何连字符开头(即通常称为命令行选项,如或)开头时,您不需要使用参数分离运算符,否则会将它们视为自身的选项,而不是脚本的选项。---o--optioncomposercomposer

如果自定义脚本定义运行多个命令,则传递的参数将附加到每个命令。此外,您不能使用 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 Composer\Script\Event;
use Composer\Installer\PackageEvent;

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


  [Symfony\Component\Console\Exception\RuntimeException]
  The "--option" option does not exist.


pass-args-to-callback [--dev] [--no-dev] [--] [<args>]...

测试 2:显示参数和选项在回调中的显示方式

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

测试 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


答案 2

您可以将双破折号添加到脚本条目的末尾。--

这样,您可以将其他参数/选项传递给基础脚本。

{
    "scripts": {
        "test": "phpunit",
        "test-single": "phpunit --"
    }
}

使用自定义 phpunit 过滤器运行脚本:test-single

composer test-single --filter test_function

推荐