如何将多个标志作为 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 传递

如何将多个参数作为数组传递给 ruby​​ 方法?

如何使用react将多个参数作为url中的对象传递

如何将 select 语句的 IN 子句中的参数作为具有多个值的参数传递?

在 Angularjs 中 ui-sref 和 $state.go 如何传递单个多个参数和将对象作为参数