【问题标题】:How to pass multiple flags as a Cake argument?如何将多个标志作为 Cake 参数传递?
【发布时间】: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 语法,但我想我愿意接受替代方案。

【问题讨论】:

    标签: c# build enums cakebuild


    【解决方案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 并且我们最终会日落,因此不太可能修复它其他蛋糕跑者
    猜你喜欢
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多