【问题标题】:How do you pass an argument to a composer script from the command line?如何从命令行将参数传递给作曲家脚本?
【发布时间】:2017-12-08 04:26:53
【问题描述】:

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

composer custom_script_cli --custom_argument

发生的情况是作曲家认为我在询问作曲家我是否想将该参数传递给作曲家而不是自定义脚本。

有没有办法在不强制将其添加到自定义脚本本身的情况下做到这一点?

我发现与该主题相关的唯一内容是git issue from 2013,当时它表示这是不可能的。不知道 4 年后是否仍然如此。

【问题讨论】:

  • composer custom_script_cli -- --custom_argument 也许?注意它们用于分隔参数的双破折号 (--)。

标签: php composer-php


【解决方案1】:

你可以在最后传递参数:

composer custom_script_cli [--dev] [--no-dev] [--] [<args>]...

意思是这样的

composer custom_script_cli argument1 argument2

然后你可以像这样在你的脚本中得到它:

public static function commandcode(Event $event) {
   $event->getArguments(); ...
}

您所指的东西称为选项。

【讨论】:

    【解决方案2】:

    任何类型的参数都可以简单地传递给 custom-composer-scripts 通过像往常一样将它们附加在命令行上,但在 -- 之后 (即特殊的参数分隔运算符,它不会传递给脚本本身)。

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

    如果自定义脚本定义运行多个命令,则传递的参数将附加到每个命令。此外,您不能使用 $2 之类的 shell 编程约定来引用单个参数。

    如果自定义脚本由回调处理,则脚本负责从参数中解析选项。从回调的角度来看,-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:转储 Autoloader 以识别 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

    【讨论】:

      【解决方案3】:

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

      通过这种方式,您可以将其他参数/​​选项传递给底层脚本。

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

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

      composer test-single --filter test_function
      

      【讨论】:

        【解决方案4】:

        我只是想补充一下 Kamal 的答案 (https://stackoverflow.com/a/57902964/7602110)。您无需在脚本条目的末尾添加双破折号 --,它会将任何内容传递到脚本的末尾。

        例如:

        {
            "scripts": {
                "greet": "echo Hello"
            }
        }
        

        因此如果你运行

        composer greet Abraham
        

        你会得到

        > echo Hello 'Abraham'
        Hello Abraham
        

        【讨论】:

          猜你喜欢
          • 2020-12-17
          • 1970-01-01
          • 2013-10-11
          • 1970-01-01
          • 2014-03-08
          • 2013-10-22
          • 2016-12-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多