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

时间:2017-07-04 16:08:09

标签: php composer-php

我正在尝试通过cli运行自定义编写器脚本,如下所示:

composer custom_script_cli --custom_argument

当作曲家认为我想要将该参数传递给作曲家而不是自定义剧本时,会发生什么呢?

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

我发现只有与此主题相关的内容是git issue from 2013,当时表示这是不可能的。不确定4年后是否仍然如此。

4 个答案:

答案 0 :(得分:9)

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

但是,您不需要使用--参数分隔运算符 当没有一个参数以任何连字符开头时 (即通常称为命令行选项,例如-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:转储自动加载器以识别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

答案 1 :(得分:1)

您可以在脚本条目的末尾添加双破折号public override void OnSwiped(RecyclerView.ViewHolder viewHolder, int direction) { //Invoke Removing Item method from this.mdapter.RemoveItem(viewHolder.AdapterPosition); }

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

--

要使用自定义phpunit过滤器运行{ "scripts": { "test": "phpunit", "test-single": "phpunit --" } } 脚本,

test-single

答案 2 :(得分:-1)

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

例如:

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

因此,如果您运行

composer greet Abraham

你会得到

> echo Hello 'Abraham'
Hello Abraham

答案 3 :(得分:-2)

你可以在最后传递参数:

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

这意味着像这样的事情

composer custom_script_cli argument1 argument2

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

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

你所指的是一个选项。