如何将一个字符串数组的参数传递给我的Cake脚本?

Tom*_*han 3 cakebuild

我希望得到一个Argument<IEnumerable<string>>(或者string[],或者其他 - 一个可迭代的字符串列表)到我的Cake脚本,但我无法弄清楚如何将它传递build.ps1cake.exe.

这是我到目前为止:

在build.ps1中:

param(
    # ...
    [ValidateSet("Bar", "Baz")]
    [string[]]$Foo
)

# ...

$fooArg = If ($Foo.Count -gt 0) {"-foo=`(`"{0}`"`)" -f [string]::Join("`",`", $Foo)} Else {""}
Invoke-Expression "$CAKE_EXE ... $fooArg"
Run Code Online (Sandbox Code Playgroud)

在build.cake中:

var baz = Argument<IEnumerable<string>>("foo", new string[0]);
Run Code Online (Sandbox Code Playgroud)

但是,当我执行此操作时,我收到以下错误:

指定了多个构建脚本.

找不到要执行的构建脚本.
第一个参数必须是构建脚本的路径,
或构建脚本应遵循默认的脚本名称约定.

用法:Cake.exe [build-script] [-verbosity = value] [-showdescription] [-dryrun] [..]

示例:Cake.exe示例:Cake.exe build.cake -verbosity = quiet示例:Cake.exe build.cake -showdescription

选项:-verbosity = value指定要显示的信息量.(安静,最小,正常,详细,诊断)-showdescription显示有关任务的描述.-dryrun执行干运行.-version显示版本信息.-help显示用法信息.-experimental使用Roslyn脚本引擎的每晚构建.

这样做的正确方法是什么?

Pat*_*son 5

解决方案#1(简单):

您可以通过将参数作为字符串接受并将其拆分来解决它:

var foo = Argument("foo", string.Empty).Split(',');
Run Code Online (Sandbox Code Playgroud)

解决方案#2(复杂):

您还可以通过将字符串数组包装在自定义类型中并TypeConverter为该类型实现a 来解决此问题.包装器和类型转换器都必须驻留在.NET程序集中,该程序集将通过#ror #addin指令加载.

[TypeConverter(typeof(StringArrayConverter))]
public class StringArray
{
    public string[] Items { get; }
}

public class StringArrayConverter : TypeConverter
{
  // Implementation here :)
}
Run Code Online (Sandbox Code Playgroud)

然后,您将Argument像往常一样使用该StringArray类型的别名.

var foo = Argument<StringArray>("foo", null);
Run Code Online (Sandbox Code Playgroud)

在我看来,这个选项对于获取字符串数组来说有点复杂,所以你可能想要使用更简单的解决方案,直到我们为参数添加了IEnumerable支持.