4

我想为我的 Cake 脚本获取一个Argument<IEnumerable<string>>(或string[],或其他任何东西 - 一个可迭代的字符串列表),但我不知道如何将它从build.ps1to 传递给cake.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"

在 build.cake 中:

var baz = Argument<IEnumerable<string>>("foo", new string[0]);

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

指定了多个构建脚本。

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

用法: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 脚本引擎的夜间构建。

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

4

1 回答 1

7

解决方案#1(简单):

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

var foo = Argument("foo", string.Empty).Split(',');

解决方案#2(复杂):

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

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

public class StringArrayConverter : TypeConverter
{
  // Implementation here :)
}

然后,您将Argument像往常一样将别名与StringArray类型一起使用。

var foo = Argument<StringArray>("foo", null);

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

于 2016-03-01T22:43:17.510 回答