问题描述
根据 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 支持使用 --argumentName
和 value
之间的空格代替 =
符号。例如:
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