我希望得到一个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"
Run Code Online (Sandbox Code Playgroud)
在build.cake中:
var baz = Argument<IEnumerable<string>>("foo", new string[0]);
Run Code Online (Sandbox Code Playgroud)
但是,当我执行此操作时,我收到以下错误:
指定了多个构建脚本.
找不到要执行的构建脚本.
第一个参数必须是构建脚本的路径,
或构建脚本应遵循默认的脚本名称约定.用法: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脚本引擎的每晚构建.
这样做的正确方法是什么?
解决方案#1(简单):
您可以通过将参数作为字符串接受并将其拆分来解决它:
var foo = Argument("foo", string.Empty).Split(',');
Run Code Online (Sandbox Code Playgroud)
解决方案#2(复杂):
您还可以通过将字符串数组包装在自定义类型中并TypeConverter为该类型实现a 来解决此问题.包装器和类型转换器都必须驻留在.NET程序集中,该程序集将通过#ror #addin指令加载.
[TypeConverter(typeof(StringArrayConverter))]
public class StringArray
{
public string[] Items { get; }
}
public class StringArrayConverter : TypeConverter
{
// Implementation here :)
}
Run Code Online (Sandbox Code Playgroud)
然后,您将Argument像往常一样使用该StringArray类型的别名.
var foo = Argument<StringArray>("foo", null);
Run Code Online (Sandbox Code Playgroud)
在我看来,这个选项对于获取字符串数组来说有点复杂,所以你可能想要使用更简单的解决方案,直到我们为参数添加了IEnumerable支持.
| 归档时间: |
|
| 查看次数: |
1913 次 |
| 最近记录: |