这个 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】:&
标记节点的别名(在您的示例中,&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 specification - 2.2 Structures 了解更多详细信息(或者如果您甚至需要 moar docs++:3.2.2.2. Anchors and Aliases)
【讨论】:
好奇:“test”扩展为 test:&test 适配器:postgresql # 来自“默认”别名数据库:dev_development # 来自“默认”别名数据库:test_test 完全准确。第二个“数据库”是否覆盖从“*默认”引用的那个? @Gripp 是的,<<: *default
之后声明的数据库键会覆盖它。使用YAML 会产生"development"=>"adapter"=>"postgresql", "database"=>"dev_development", "test"=>"adapter"=>"postgresql", "database"=>"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
&test
创建对这些特定设置的引用。
<<: *default
表示使用默认设置进行测试
cucumber:
<<: *test
所以现在我们知道,对于cucumber
,我们想要使用来自test
的设置。
【讨论】:
【参考方案5】:&default
表示您正在用一些名称标记这组属性以供以后使用
<<: *default
表示您将包含标记为默认组的所有属性
【讨论】:
以上是关于这个 database.yml 文件中的 &,<<, * 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
如何在database.yml文件中设置rails环境变量?
如何使用 database.yml 为每个环境定义 json 文件
为 Ruby on Rails Database.yml 文件正确配置 MySQL