你如何在 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 支持在 --argumentName
和 value
之间使用 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
根据 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 支持在 --argumentName
和 value
之间使用 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