如何将多个标志作为 Cake 参数传递?
Posted
技术标签:
【中文标题】如何将多个标志作为 Cake 参数传递?【英文标题】:How to pass multiple flags as a Cake argument? 【发布时间】:2021-07-22 23:04:57 【问题描述】:我们有许多构建标志希望能够作为单个参数传递给我们的 Cake 脚本。基于this 答案和TypeConverter documentation,我希望以下简化代码能够编译和运行。
public class BuildFlagsConverter : TypeConverter
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
return true;
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
return BuildFlags.None;
[Flags]
[TypeConverter(typeof(BuildFlagsConverter))]
enum BuildFlags
None = 0,
FeatureOne = 1,
FeatureTwo = 2,
All = FeatureOne | FeatureTwo,
var buildFlags = Argument<BuildFlags>("buildFlags", BuildFlags.All);
然后我希望能够调用cake --buildFlags="FeatureOne|FeatureTwo"
来构建。相反,Cake 抛出以下错误:
错误:出现一个或多个错误。 (FeatureOne|FeatureTwo 不是 BuildFlags 的有效值。)
我认为这可能与使用枚举而不是类有关,因此我尝试将 BuildFlags
转换为具有上述每个值的静态 getter 的静态类。但是,在这种情况下,我仍然收到错误:
错误:出现一个或多个错误。 (TypeConverter 无法从 System.String 转换。)
我错过了什么吗?有一个更好的方法吗?理想情况下,我们仍然会在脚本本身中获得 enum
语法,但我想我愿意接受替代方案。
【问题讨论】:
【参考方案1】:更新
故障排除后,使用自定义类型转换器似乎在 .NET、.NET Core 和 .NET Framework 上运行良好,但在 Mono 上运行不佳。
报告为错误 - https://github.com/cake-build/cake/issues/3333
是否有可能您使用的是不支持自定义类型转换器的旧版 Cake?
截至撰写本文时,我在最新版本的 Cake (1.1.0) 上测试了您的代码,它按预期工作。
using System.ComponentModel;
using System.Globalization;
public class BuildFlagsConverter : TypeConverter
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
return true;
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
return BuildFlags.None;
[Flags]
[TypeConverter(typeof(BuildFlagsConverter))]
enum BuildFlags
None = 0,
FeatureOne = 1,
FeatureTwo = 2,
All = FeatureOne | FeatureTwo,
var buildFlags = Argument<BuildFlags>("buildFlags", BuildFlags.All);
Information("buildFlags converted to: 0", buildFlags);
【讨论】:
是的,我们现在是 0.38.5,我没想到这是(相对)最近添加的。估计是时候升级了。谢谢! 实际上,在更新到 Cake 1.1.0 后,我并没有看到您显示的相同行为;使用--buildFlags="FeatureOne|FeatureTwo"
调用 Cake 仍然给出与我在上面分享的相同的“无效值”错误。我什至复制了你的脚本只是为了验证。
@steverichey 你想把一个 repro 项目放在 GitHub repo 上吗?正如您在上面的屏幕截图中看到的......它在我的 Windows 虚拟机上运行。
我的设置与您发布的相同,但我使用的是 macOS 11.3.1,所以我猜这会导致我的问题。
@steverichey 我可以重现您在使用自制版本的 Cake 时看到的错误。我的猜测是 Mono 无法在已编译的 Cake 脚本中看到类型转换器的问题,这在 .NET 中运行时不是问题。我正在将其作为主要存储库 github.com/cake-build/cake/issues/3333 中的错误进行跟踪,但鉴于我们的一般建议是迁移到 CI 系统中的 .NET 工具 - cakebuild.net/docs/running-builds/runners/dotnet-tool 并且我们最终会日落,因此不太可能修复它其他蛋糕跑者以上是关于如何将多个标志作为 Cake 参数传递?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JavaScript 将包含多个数组的数组作为参数化 URL 传递