你如何在 Cake v1 中传递空参数?

How do you pass empty arguments in Cake v1?

根据 upgrade 文档,从 v1.0 开始,./build.sh arg= 不再可能。事实上,这会产生:

Error: Expected an option value.

但是它也不适用于 arg=''。我可以将其关闭并依赖默认值,但这很难从我的 Azure DevOps 管道中做到,它读起来像 - script: ./build.sh --arg='$(arg1)',其中 arg1 是在别处定义的变量。

问题是我的 DevOps 管道中的变量 arg1 是外部定义的,可能为空也可能不为空。

我能想到的最好的方法是至少传递一个 space,例如 ./build.sh --arg='$(arg) '(注意最后的 space)并始终检查 string.IsNullOrWhiteSpace 和总是修剪,但这似乎很老套。

是否有更简洁的解决方案来从命令行传递可能为空的变量?如果不是,我如何重写我的 Azure DevOps YML 以在它为空时不传递参数?

与 Cake 1.0 的一个主要区别是它超越键值参数 (--key=value),支持标志 (--flag) 和多个同名参数 (--key=value1 --key=value2)。这比以前有更大的灵活性。

由于没有提供示例脚本,我的示例将是 emptyarg.cake 如下所示

var arg = Argument<string>("arg", null);

Information("Arg: {0}", arg ?? "NULL");
  • dotnet cake .\emptyarg.cake 将输出 Arg: NULL
  • dotnet cake .\emptyarg.cake --arg 将输出 Arg: NULL
  • dotnet cake .\emptyarg.cake --arg=" " 将输出 Arg:

如果您想将上述所有示例视为缺少参数,您可以创建一个可重用的辅助方法。

public string ArgumentNotNullOrWhiteSpace(string key)
{
    var value = Argument<string>(key, null);
    return string.IsNullOrWhiteSpace(value)
        ? null
        : value;
}


var arg = ArgumentNotNullOrWhiteSpace("arg");

Information("Arg: {0}", arg ?? "NULL");

然后输出

dotnet cake .\emptyarg.cake
dotnet cake .\emptyarg.cake --arg
dotnet cake .\emptyarg.cake --arg=hh
dotnet cake .\emptyarg.cake --arg="  "

将会

Arg: NULL
Arg: NULL
Arg: hh
Arg: NULL

如果你想要一些默认值,你可以使用 ?? 运算符,即

var arg = ArgumentNotNullOrWhiteSpace("arg") ?? "default" 输出将是

Arg: default
Arg: default
Arg: hh
Arg: default

TL;DR;如果值可以是 empty/null.

,请使用 (space) 而不是 =
./build.sh --arg '$(arg1)'

Cake v1.0 支持在 --argumentNamevalue 之间使用 space 作为 = 符号的替代。例如:

dotnet cake empty-args.cake --arg1 --arg2
dotnet cake empty-args.cake --arg1 valueA --arg2
dotnet cake empty-args.cake --arg1 --arg2 valueB
dotnet cake empty-args.cake --arg1 valueA --arg2 valueB

使用如下示例 Cake 脚本,它将输出以下内容:

var arg1 = Argument<string>("arg1", null);
var arg2 = Argument<string>("arg2", null);

Information("arg1: {0}", arg1);
Information("arg2: {0}", arg2);
dotnet cake empty-args.cake --arg1 --arg2
arg1: [NULL]
arg2: [NULL]

dotnet cake empty-args.cake --arg1 --arg2
arg1: [NULL]
arg2: [NULL]

dotnet cake empty-args.cake --arg1 valueA --arg2
arg1: valueA
arg2: [NULL]

dotnet cake empty-args.cake --arg1 --arg2 valueB
arg1: [NULL]
arg2: valueB

dotnet cake empty-args.cake --arg1 valueA --arg2 valueB
arg1: valueA
arg2: valueB