yaml语法

背景

在看gitlab-ci时,官方文档多次提及锚点,
发现对yaml的用法没有注意太多,
于是补充一些知识.

介绍

是 YAML Ain’t Markup Language的嵌套简称,
一开始用缩进表达关系.
尽管目前加入了不少新奇的写法,
不过个人认为限于缩进表意的方式,发展出来的有可能还是借助标记来实现功能.

语法等

基本语法

  • 大小写敏感
  • 使用缩进表示层级关系
    • 不允许使用TAB,只允许使用空格
    • 一般来说只要下一级对齐即可,不限制有多少个空格
  • 使用#表示注释

数据结构

  • 单纯的数据
    • 字符串
      • 默认不需要引号,如果字符串中想包含冒号等妨碍解析的字符则需要引号
      • 使用时不区分是单引号还是双引号
    • true和false
    • 数字(整数和浮点书)
    • ~用来表示NULL
    • 时间(使用ISO8601格式,2001-12-14t21:59:43.10-05:00 )
    • 日期(yyyy-mm-dd格式)
  • 对象(使用冒号的键值对)
  • 数组
    • 写成一行是 [a, b]
    • 写成多行则与markdown相同

奇技淫巧

多行字符串

第二行空一个空格写,认为是同一行

1
2
3
4
5
str: 一段
多行
字符串
# 等效于
srt: '一段 多行 字符串'

使用 > 和默认的行为类似,但会保留最后一个换行符,
就像emacs编辑的文件,永远给最后一行加上换行符.

1
2
3
4
str: >
Foo
Bar
str: 'Foo Bar\n'

而如果想表达类似python中三个引号的作用,保留字符串 的换行,可以使用 |
如果使用 + , - 等标记,则可以对末尾的换行符做定义,
+ 表示保留, - 表示删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
str: |
Foo

# 默认效果是忽略空行,保留每行后的换行
str: 'Foo\n'

str: |+
Foo

# 使用加号会保存所有空行,并认为默认有个换行
str: 'Foo\n\n'

str: |-
Foo

# 使用减号会trim掉字符串结尾的所有\n字符
str: 'Foo'

锚点和别名

主要用途是通过引用一部分公共的内容,减少文件中重复的部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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

参考

  1. 阮一峰的简明教程
  2. 官方1.2版本文档