2011-07-11 70 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

在陽明文件,你不必在不同的一次又一次改寫數據庫連接參數環境如果連接參數相似。在上述情況下,環境黃瓜使用與測試環境中相同的連接參數。生產環境使用除數據庫名稱外的開發中的連接參數。這就像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 適配器:postgresql#來自「默認」別名 database:dev_development#from 「默認」別名 數據庫:test_test 要完全準確。第二個「數據庫」是否覆蓋從「* default」引用的那個? – Gripp

8

&default意味着你標註此屬性集的一些名稱以供稍後使用

<<: *default意味着你包括組標記爲默認

2

他們引用的方式全部屬性環境,而不必一遍又一遍地重複相同的設置(幹起來)。

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 

但是,如果你不希望覆蓋擴展字段中,你可以跳過「< <:」

相關問題