问题描述
我们有许多构建标志,我们希望能够将其作为单个参数传递给 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
语法,但我想我愿意接受替代方案。
解决方法
更新
故障排除后,使用自定义类型转换器似乎在 .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);