【问题标题】:How do I pass an argument that is a string array to my Cake script?如何将字符串数组的参数传递给我的 Cake 脚本?
【发布时间】:2016-06-14 02:42:39
【问题描述】:

我想将Argument<IEnumerable<string>>(或string[],或其他任何东西 - 一个可迭代的字符串列表)添加到我的 Cake 脚本,但我不知道如何将它从 build.ps1 传递到 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 脚本引擎的夜间版本。

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

【问题讨论】:

    标签: cakebuild


    【解决方案1】:

    解决方案 #1(简单):

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

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

    解决方案 #2(复杂):

    您也可以通过将字符串数组包装在自定义类型中并实现 TypeConverter 用于该类型。包装器和类型转换器都必须 驻留在将通过#r#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);
    

    在我看来,这个选项对于获取字符串数组来说有点复杂,所以在we've added IEnumerable support for arguments 之前,您可能希望使用更简单的解决方案。

    【讨论】:

      猜你喜欢
      • 2022-12-09
      • 2016-09-15
      • 2010-09-06
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 2014-04-13
      • 2017-03-12
      • 2013-06-18
      相关资源
      最近更新 更多