yml引用其他变量
参考: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