我想要一个Argument<IEnumerable<string>> (或者string[],或者其他什么--一个可迭代的字符串列表)到我的Cake脚本中,但是我想不出如何将它从build.ps1传递到cake.exe。
到目前为止,这就是我所拥有的:
In 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"In build.cake:
var baz = Argument<IEnumerable<string>>("foo", new string[0]);但是,当我执行此操作时,会得到以下错误:
指定了多个构建脚本。 找不到要执行的生成脚本。 第一个参数必须是构建脚本的路径, 或者构建脚本应该遵循默认的脚本名称约定。 用法: Cake.exe build-script -showdescription .. 示例: Cake.exe示例: Cake.exe build.cake -verbosity=quiet示例: Cake.exe build.cake -showdescription 选项:-verbosity=value指定要显示的信息量。(安静,最小,正常,冗长,诊断) -showdescription显示了关于任务的描述。-dryrun执行一次试运行。-version显示版本信息。-help显示使用信息。-experimental使用罗斯林脚本引擎的夜间构建。
正确的方法是什么?
发布于 2016-03-01 22:43:17
解决方案#1 (简单):
您可以简单地通过接受参数作为字符串并拆分它来解决这个问题:
var foo = Argument("foo", string.Empty).Split(',');解决方案#2 (复杂):
您还可以通过将字符串数组包装在自定义类型中并为该类型实现TypeConverter来解决这一问题。包装器和类型转换器都必须驻留在.NET程序集中,该程序集将通过#r或#addin指令加载。
[TypeConverter(typeof(StringArrayConverter))]
public class StringArray
{
public string[] Items { get; }
}
public class StringArrayConverter : TypeConverter
{
// Implementation here :)
}然后,您将像往常一样在Argument类型中使用StringArray别名。
var foo = Argument<StringArray>("foo", null);在我看来,这个选项对于获取字符串数组来说有点复杂,所以您可能希望在我们增加了对参数的IEnumerable支持之前使用更简单的解决方案。
https://stackoverflow.com/questions/35727010
复制相似问题