2011-07-11 15 views
108

これまでは、明示的に呼び出された各パラメータでdatabase.ymlを使用していましたが、それ以下のファイルではわかりません。各行と記号(&、*、< <)の意味は、このファイルをどのように読むのですか?このdatabase.ymlファイルの&、<<、*は何を意味しますか?

development: &default 
    adapter: postgresql 
    database: dev_development 

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


cucumber: 
    <<: *test 

production: 
    <<: *default 
    database: test_production 
+4

YMLファイルで使用すると、別のに何度も何度もデータベース接続パラメータを書き換える必要はありません接続パラメータが類似している場合は、環境ここでは上記の場合、環境キュウリはテスト環境と同様に正確な接続パラメータを使用します。また、本番環境では、データベース名以外の開発で接続パラメータを使用します。これはDRY(自分自身を繰り返さない)コードのようなものです。私を修正してください。 – kxhitiz

+0

**参照:** http://yaml.org/type/merge.html – dreftymac

答えて

131

は(あなたの例では&default別名「デフォルト」などの開発ノード)と*参照名「デフォルト」とエイリアスノードをノードの別名をマーク。 <<:は、そのノードの内容を挿入します。

ことは私がここでYAMLの仕様を引用することを許可する:

繰り返しノード(オブジェクト)最初(アンパサンドが付い - 「&」)アンカーによって識別され、し、エイリアス(アスタリスクで参照されています - "*")。

ので、あなたの例の一部

test: &test 
    <<: *default 

は実際に

test: &test 
    adapter: postgresql  # from the "default" alias 
    database: dev_development # from the "default" alias 

に拡大すると同時に、別名「テスト」の下で利用できるだけでなく、「テスト」ノードを作ります。 は詳細についてYAML specification - 2.2 Structuresを見て(あるいはあなたもmoarドキュメント++が必要な場合:3.2.2.2. Anchors and Aliases)を

+1

好奇心: "test"は にテストします。&test アダプター:postgresql# "default"エイリアスから データベース:dev_development#from "default"エイリアス データベース:test_test 完全に正確に入力してください。 2番目の「データベース」は「* default」から参照されるものを上書きしますか? – Gripp

8

&default後で

<<: *defaultデフォルト

2

としてラベルグループからのすべての属性は、それらが参照する方法です含めていることを意味を使用するためにあなたには、いくつかの名前でこの属性セットを標識している意味同じ設定を何度も何度も繰り返す必要はありません(DRY)。

test: &test 
    <<: *default 

&testこれらの特定の設定への参照が作成されます。

<<: *defaultは、だから今我々がcucumberのために、我々はtestからの設定を使用したいことを知っているテスト

cucumber: 
    <<: *test 

のデフォルト設定を使用しますと言います。 &

8

これらは、(アンカーで標識されたノードを参照ノードの参照(*)と連想配列のマージ(< <)を表します&)タグ - wikipedia

online自分自身で試してみてください。

+0

YAMLパーサへのリンクをありがとう。持っているととてもいいです。 –

1

簡単な言葉で言えば、この概念はベースクラスと派生クラスに似ています。

基本クラスのテンプレートでは、すべての共通の詳細を '&'と記述します。つまり、これらのフィールドが必要な他の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 

しかし、あなたが拡張フィールドを上書きしたくない場合、あなたはスキップすることができます「< <:」を

関連する問題