【问题标题】:YAML configuration with validity range有效范围的 YAML 配置
【发布时间】:2020-09-16 23:30:50
【问题描述】:

我有一个 YAML 文件,其中包含我的应用程序的一些配置。现在,一些配置需要及时更改。例如:

2020 年的值是:

tax:
    federal: 9
    provincial: 7

但是对于 2021 年,我们需要的是:

tax:
    federal: 9.5
    provincial: 7.5

如果我只能通过时间切换 yml 文件会很容易,但是 yaml 文件包含许多会在不同时间点更改的配置。另外,我只分配了 1 个 yml 文件来配置我的应用程序,所以这不是一个真正的选择。

所以我的问题是,使用 YAML 表示这一点的最简洁的方法是什么?

我能想到的唯一方法是以下,但我可以看到这非常混乱。

tax:
    federal: [20200101-20201231]9;[20210101-20211231]9.5
    provincial:  [20200101-20201231]7;[20210101-20211231]7.5;

【问题讨论】:

    标签: configuration yaml properties-file


    【解决方案1】:

    您的语法是非法的,您需要将其括在引号中,将其解析为单个标量,然后对其进行后处理。

    我建议使用 YAML 的标签系统:你使用像 !datedep 这样的标签来标记值,例如:

    tax:
        federal: !datedep { [20200101, 20210101, 20220101]: [9, 7.5] }
        provincial: !datedep { [20200101, 20210101, 20220101]: [7, 7.5] }
    

    我将一个带有单个键值对的 YAML 映射作为值。关键是日期列表,建立其间的范围。该值是应映射到日期之间范围的值列表。

    在加载 YAML 时,您必须为标签 !datedep 提供构造函数。这如何工作取决于您的实施。构造函数应根据当前日期选择适当的值。您可以使用 YAML 锚点和别名来引用重复的日期范围,例如:

    tax:
        federal: !datedep { &y2021 [20200101, 20210101, 20220101]: [9, 7.5] }
        provincial: !datedep { *y2021 : [7, 7.5] }
    

    【讨论】:

    • 我喜欢你的解决方案。我试过了,但看起来我无法让它工作,因为我的 YAML 配置通过 Spring-cloud-config 通过 REST 调用将其公开为属性文件。我真的不知道这个 Spring-cloud 机制是如何工作的。所以我可能只是使用我的第一个想法,但是正如你所指出的那样,我的语法是正确的。谢谢
    • @pmartin8 您可以删除!datedep 并使用{20200101: 9, 20210101: 7,5, 20220101: null} 之类的结构,该结构应在属性文件中转换为tax.federal.20200101 = 9 等,但我同意在属性文件中包含日期更容易使用属性文件时的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多