微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

Error: Expected an option value.

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

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

我能想到的最好的方法是至少传入一个./build.sh --arg='$(arg) ' 这样的空格(请注意末尾的空格)并始终检查 string.IsNullOrWhiteSpace 并始终进行 Trimming,但这似乎很hacky。

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

解决方法

TL;博士;如果值可以为空/空,请使用 (空格)而不是 =

./build.sh --arg '$(arg1)'

Cake v1.0 支持使用 --argumentNamevalue 之间的空格代替 = 符号。例如:

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
,

与 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。