參考:YAML文件(.yml)中的鍵(key)通過變量引用來設置 - i江湖中人 - 博客園
通過變量引用設置配置量的【值(value)】
在YAML文件中,一個配置量的值可以通過引用另一個變量來設置。例如:
-
default-db:
-
port: 3306
-
-
user-db:
-
port: ${default-db.port}
但是,如果想通過變量引用設置鍵,通過${}是做不到的。例如:
-
site:
-
url:
-
user: www.user.net
-
shop: www.shop.net
-
-
site:
-
slogan:
-
${site.url.user}: everyone is great!
-
${user.url.shop}: buy anything you want!
在將配置讀入程序中之後,你會發現上述的${}引用,並沒有替換成真正的值。
通過錨點引用設置配置量的【鍵(key)】
要想替換鍵,則需要用到錨點。錨點用符號“&”定義,並用符號“*”進行引用。
錨點有兩種使用方式,一是通過“<<:”將鍵值對一起引入:
-
default-db: &default-db-config
-
host: 127.0.0.1
-
port: 3306
-
-
user-db:
-
<<: *default-db-config
其實際效果如:
-
default-db:
-
host: 127.0.0.1
-
port: 3306
-
-
user-db:
-
host: 127.0.0.1
-
port: 3306
說明:&後面的錨點名字,可自己定義,不必與配置量的鍵相同。
另一種是僅引入配置的值:
-
site:
-
url:
-
user: &site.user www.user.net
-
shop: &site.shop www.shop.net
-
-
site:
-
slogan:
-
*site.user: everyone is great!
-
*site.shop: buy anything you want!
-
其實際效果如:
-
site:
-
url:
-
user: www.user.net
-
shop: www.shop.net
-
-
site:
-
slogan:
-
www.user.net: everyone is great!
-
www.shop.net: buy anything you want!
說明:用&定義錨點時,注意錨點名前後的空格。
另一個僅引入值例子:
-
color:
-
- &red-color red
-
- yellow
-
- blue
-
- *red-color
-
- gray
其實際效果如:
-
color:
-
- red
-
- yellow
-
- blue
-
- red
-
- gray
參考文檔:
七、引用
錨點&
和別名*
,可以用來引用。
defaults: &defaults adapter: postgres host: localhost development: database: myapp_development <<: *defaults test: database: myapp_test <<: *defaults
等同於下面的代碼。
defaults: adapter: postgres host: localhost development: database: myapp_development adapter: postgres host: localhost test: database: myapp_test adapter: postgres host: localhost
&
用來建立錨點(defaults
),<<
表示合併到當前數據,*
用來引用錨點。
下面是另一個例子。
- &showell Steve - Clark - Brian - Oren - *showell
轉爲 JavaScript 代碼如下。
[ 'Steve', 'Clark', 'Brian', 'Oren', 'Steve' ]
八、函數和正則表達式的轉換
這是 JS-YAML 庫特有的功能,可以把函數和正則表達式轉爲字符串。
# example.yml fn: function () { return 1 } reg: /test/
解析上面的 yml 文件的代碼如下。
var yaml = require('js-yaml'); var fs = require('fs'); try { var doc = yaml.load( fs.readFileSync('./example.yml', 'utf8') ); console.log(doc); } catch (e) { console.log(e); }
從 JavaScript 對象還原到 yaml 文件的代碼如下。
var yaml = require('js-yaml'); var fs = require('fs'); var obj = { fn: function () { return 1 }, reg: /test/ }; try { fs.writeFileSync( './example.yml', yaml.dump(obj), 'utf8' ); } catch (e) { console.log(e); }
九、參考鏈接
yaml文件的 錨點& 與 引用*
簡介
- 當yaml文件中出現多個重複內容時,可以通過 錨點& 與引用* ,實現引用錨點處內容的功能,從而在修改時,只需要修改錨點處的內容,即可在所有引用處生效
- 參考網址:http://www.ruanyifeng.com/blog/2016/07/yaml.html?f=tt
兩種方式實現
通過 << 符號
- 如在erver對redis的訪問配置中,針對不同的db可能會寫成如下配置:
其實host配置都是一樣的,只有db不一樣,所以我們通過錨點和引用的功能,可以寫成如下:user: host: 127.0.0.1 db: 8 book: host: 127.0.0.1 db: 9 comment: host: 127.0.0.1 db: 10
localhost: &localhost1 host: 127.0.0.1 user: <<: *localhost1 db: 8 book: <<: *localhost1 db: 9 comment: <<: *localhost1 db: 10
其中,&表示將localhost1作爲localhost的別名,標識取別名localhost1對應的value,<<表示將localhost1代表的map合併入當前map數據。、
不通過 << 符號
- 如上的第一個示例,直接通過名字進行鍵值對應,也是可以的;
localhost: host: &host 127.0.0.1 user: host: *host db: 8 book: host: *host db: 9 comment: host: *host db: 10
即,直接在鍵後設置錨點,然後空格設置值,這樣在引用時,只引用值,而鍵名可以自己設置,不用和錨點一致。
注意:
1. 錨點必須設置在引用之前 2. 如果一個yaml文件中,有多個相似模塊,要注意錨點的命名,防止引用錯誤(錨點的引用時全局性的,只分文件,不分模塊) 3. 錨點處的值不能爲引用值,必須爲具體值。
通過變量引用設置配置量的【值(value)】
在YAML文件中,一個配置量的值可以通過引用另一個變量來設置。例如:
default-db:
port: 3306
user-db:
port: ${default-db.port}
但是,如果想通過變量引用設置鍵,通過${}是做不到的。例如:
site:
url:
user: www.user.net
shop: www.shop.net
site:
slogan:
${site.url.user}: everyone is great!
${user.url.shop}: buy anything you want!
在將配置讀入程序中之後,你會發現上述的${}引用,並沒有替換成真正的值。
通過錨點引用設置配置量的【鍵(key)】
要想替換鍵,則需要用到錨點。錨點用符號“&”定義,並用符號“*”進行引用。
錨點有兩種使用方式,一是通過“<<:”將鍵值對一起引入:
default-db: &default-db-config
host: 127.0.0.1
port: 3306
user-db:
<<: *default-db-config
其實際效果如:
default-db:
host: 127.0.0.1
port: 3306
user-db:
host: 127.0.0.1
port: 3306
說明:&後面的錨點名字,可自己定義,不必與配置量的鍵相同。
另一種是僅引入配置的值:
site:
url:
user: &site.user www.user.net
shop: &site.shop www.shop.net
site:
slogan:
*site.user: everyone is great!
*site.shop: buy anything you want!
其實際效果如:
site:
url:
user: www.user.net
shop: www.shop.net
site:
slogan:
www.user.net: everyone is great!
www.shop.net: buy anything you want!
說明:用&定義錨點時,注意錨點名前後的空格。
另一個僅引入值例子:
color:
- &red-color red
- yellow
- blue
- *red-color
- gray
其實際效果如:
color:
- red
- yellow
- blue
- red
- gray