&,<<,*在此database.yml文件中是什么意思?


161

到目前为止,我只使用了database.yml,每个参数都被明确调用,在下面的文件中,它使用了一些我不理解的字符。每行和符号(&,*,<<)是什么意思,我该如何读取该文件?

development: &default
  adapter: postgresql
  database: dev_development

test: &test
  <<: *default
  database: test_test


cucumber:
  <<: *test

production:
  <<: *default
  database: test_production

6
在yml文件中,如果连接参数相似,则不必在不同的环境中一次又一次地重写数据库连接参数。在上述情况下,环境黄瓜使用与测试环境中相同的连接参数。除了数据库名称外,生产环境也像开发中一样使用连接参数。这类似于DRY(不要重复自己)代码。请随时纠正我。
kxhitiz 2011年

Answers:


191

&标志为节点的别名(在你的榜样&default别名开发节点为“默认”)和*引用名为“默认”的别名节点。在<<:插入该节点的内容。

请允许我在此处引用YAML规范:

重复的节点(对象)首先由锚点(标记为“&”号)识别,然后再别名(以星号-“ *”标记)。

所以你的例子的一部分

development: &default
  adapter: postgresql
  database: dev_development

test: &test
  <<: *default
  database: test_test

实际上扩展到

development: &default
  adapter: postgresql
  database: dev_development

test: &test
  adapter: postgresql       # from the "default" alias
  database: test_test       # overridden by the duplicate key

并同时使别名“ test”下的“ test”节点也可用。

看一下YAML规范 -2.2 结构以了解更多详细信息(或者如果您甚至需要摩尔文档++:3.2.2.2。锚和别名


2
好奇:“测试”扩展为测试:&test适配器:来自“默认”别名数据库的postgresql#:来自“默认”别名数据库的dev_development#:test_test完全准确。第二个“数据库”是否会覆盖从“ * default”引用的那个?
Gripp

2
@Gripp是的,<<: *default覆盖后声明的数据库密钥。借助YAML,它可以产生{"development"=>{"adapter"=>"postgresql", "database"=>"dev_development"}, "test"=>{"adapter"=>"postgresql", "database"=>"test_test"}}
陶先生

13

&default 表示您正在用一些名称标记这组属性以供以后使用

<<: *default 表示您要包含标记为默认值的组中的所有属性



3

它们是引用环境的一种方式,而不必一遍又一遍地重复相同的设置(将其干燥)。

test: &test
  <<: *default

&test 创建对这些特定设置的引用。

<<: *default 说使用默认设置进行测试

cucumber:
  <<: *test

现在我们知道,因为cucumber我们要使用中的设置test


2

用简单的话来说,这个概念类似于基类和派生类。

在基类模板中,您用'&'提及所有常见细节,这意味着它可用于扩展需要这些字段的其他yaml部分。现在,当您创建另一部分是此“基类”类型结构的配置值的超集时,可以将“ *”与基类锚点一起使用(即以“&”开头的部分)。您可以将“ <<:”用作yaml概念,以实际放置“基类”部分,以后可以覆盖。

vsm:
  stub_nsx_mgr: &MGR_CTRL_STUB
    username: ADMIN
    password: $DEFAULT_PASSWORD
    deployment: ovf
    build: $PR_BUILD
    vmnics:
      - network: $MANAGEMENT_NETWORK_0
    vc: vc_0
    ovf_options:
      - --diskMode=$DISKMODE
      - --deploymentOption=$DEPLOYMENT_OPTION
$MGR_0:
    <<: *MGR_CTRL_STUB
    ovf_path_regex: 'appliance.*\.ovf'
    ovf_options:
      - --diskMode=$DISKMODE
      - --deploymentOption=$DEPLOYMENT_OPTION
$CTRL_0:
    <<: *MGR_CTRL_STUB
    ovf_options:
      - --diskMode=$DISKMODE
      - --allowExtraConfig
$CTRL_1:
    *MGR_CTRL_STUB

但是,如果您不想覆盖扩展字段,则可以跳过“ <<:”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.