如何将多个标志作为 Cake 参数传递? 更新

问题描述

我们有许多构建标志,我们希望能够将其作为单个参数传递给 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) 上测试了您的代码,并且按预期运行。

Cake Type Converter example run

Cake Type Converter example run on MacOS


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);