这个 database.yml 文件中的 &,<<, * 是啥意思?

Posted

技术标签:

【中文标题】这个 database.yml 文件中的 &,<<, * 是啥意思?【英文标题】:What do the &,<<, * mean in this database.yml file?这个 database.yml 文件中的 &,<<, * 是什么意思? 【发布时间】:2011-10-02 20:05:10 【问题描述】:

到目前为止,我只使用了明确调用每个参数的 database.yml,在下面的文件中它使用了一些我不理解的字符。每行和符号(&,*,

development: &default
  adapter: postgresql
  database: dev_development

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


cucumber:
  <<: *test

production:
  <<: *default
  database: test_production

【问题讨论】:

在yml文件中,如果连接参数相似,您不必在不同的环境中一次又一次地重写数据库连接参数。在上述情况下,环境黄瓜使用与测试环境中相同的连接参数。并且生产环境使用除了数据库名称之外的开发中的连接参数。这类似于 DRY(不要重复自己)代码。请随时纠正我。 另见: yaml.org/type/merge.html 另见:***.com/q/9254178/974555 【参考方案1】:

&amp; 标记节点的别名(在您的示例中,&amp;default 将开发节点别名为“默认”),* 引用名称为“默认”的别名节点。 &lt;&lt;: 插入该节点的内容。

请允许我在这里引用 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 specification - 2.2 Structures 了解更多详细信息(或者如果您甚至需要 moar docs++:3.2.2.2. Anchors and Aliases)

【讨论】:

好奇:“test”扩展为 test:&test 适配器:postgresql # 来自“默认”别名数据库:dev_development # 来自“默认”别名数据库:test_test 完全准确。第二个“数据库”是否覆盖从“*默认”引用的那个? @Gripp 是的,&lt;&lt;: *default 之后声明的数据库键会覆盖它。使用YAML 会产生"development"=&gt;"adapter"=&gt;"postgresql", "database"=&gt;"dev_development", "test"=&gt;"adapter"=&gt;"postgresql", "database"=&gt;"test_test"【参考方案2】:

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

在基类模板中,您用“&”提到了所有常见的细节,这意味着它可以用来扩展需要这些字段的其他 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

但是,如果你不想覆盖扩展字段,你可以跳过'

【讨论】:

【参考方案3】:

这些表示节点引用 (*) 和关联数组合并 (wikipedia

自己试试online。

【讨论】:

【参考方案4】:

它们是一种引用环境的方法,无需一遍又一遍地重复相同的设置(干掉它)。

test: &test
  <<: *default

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

&lt;&lt;: *default 表示使用默认设置进行测试

cucumber:
  <<: *test

所以现在我们知道,对于cucumber,我们想要使用来自test 的设置。

【讨论】:

【参考方案5】:

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

&lt;&lt;: *default 表示您将包含标记为默认组的所有属性

【讨论】:

以上是关于这个 database.yml 文件中的 &,<<, * 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

如何在database.yml文件中设置rails环境变量?

无法访问“database.yml”文件中的环境变量

如何使用 database.yml 为每个环境定义 json 文件

为 Ruby on Rails Database.yml 文件正确配置 MySQL

在 Rails 项目中忽略 .gitignore config/database.yml

database.yml 中的 pool 选项有啥用