YAML配置文件

YAML是一种文本格式,Ruby on rails所有的配置文件都是使用的YAML。在很多自动化运维工具中,YAML也是很常见的。

YAML文件格式主要集中于空格缩进的概念,它用于指出数据的层次结构 – 而不是使用XML嵌套标记或JSON的大括号({})和方括号([]), 实际上,它是JSON的一个超集,因此,在使用的时候,你可能需要采用JSON风格的语法来跳出空格流,它的创始人将其形容为“为所有编程语言提供人性化的数据序列化标准”。

优势

  • YAML的可读性好。
  • YAML和脚本语言的交互性好。
  • YAML使用实现语言的数据类型。
  • YAML有一个一致的信息模型。
  • YAML易于实现。
  • YAML可以基于流来处理。
  • YAML表达能力强,扩展性好。

简单示例

ouse:
  family:
    name: Doe
    parents:
      - John
      - Jane
    children:
      - Paul
      - Mark
      - Simone
  address:
    number: 34
    street: Main Street
    city: Nowheretown
    zipcode: 12345

注意:

  1. 字串不一定要用双引号标识;
  2. 在缩排中空白字符的数目并不是非常重要,只要相同阶层的元素左侧对齐就可以了(不过不能使用TAB字符);
  3. 允许在文件中加入选择性的空行,以增加可读性;
  4. 在一个档案中,可同时包含多个文件,并用“——”分隔;
  5. 选择性的符号“...”可以用来表示档案结尾(在利用串流的通讯中,这非常有用,可以在不关闭串流的情况下,发送结束讯号)。

单行缩写

YAML也有用来描述好几行相同结构的数据的缩写语法,数组用'[]'包括起来,hash用'{}'来包括。因此,上面的这个YAML能够缩写成这样:

house:
  family: { name: Doe, parents: [John, Jane], children: [Paul, Mark, Simone] }
  address: { number: 34, street: Main Street, city: Nowheretown, zipcode: 12345 }

YAML结构组件

前面已经看了一个简单的YAML例子,下面让我们一起来了解一下YAML的结构:hash,list,和block literal。

hash(散列)

通过缩进子段和在关键字与值之间使用冒号(:)来分割实现hash的创建,如:

JFrame:
    defaultCloseOperation: JFrame.EXIT_ON_CLOSE
    title: Test Frame
    width: 800
    height: 400

还有一种方法就是使用与JSON兼容的大括号语法({})语法,每一对关键字/值使用逗号(,)分割,如:

JFrame: {defaultCloseOperation: JFrame.EXIT_ON_CLOSE, title: Test, Frame,
 width: 800, height: 400}

list(清单)

通过在每个list元素前放一个减号(-)来创建list,与空格缩进一起构成了YAML的基石:

components:
        - JTextArea
        - Jbutton

还有一种方法就是使用JSON兼容的方括号([])语法,如:

components: [JTextArea, JButton]

block literal(文字块)

这是YAML的亮点,特别是与XML相比,它的CDATA显得相当简陋,block literal可以将大块文本细致地插入文件中,你可以使用竖线(|)指令在你的文本中保留新行,如:

text: |
   This is a really long text
   that spans multiple lines (but preserves new lines).
   It does not need to be escaped with special brackets,
   CDATA tags, or anything like that

YAML编译器将会从第一行的第一个文本字符开始编译(并丢掉所有的缩进空格),但是会在你的文本中保留新行。

另外,你还可以使用大于符号(>)告诉YAML编译器给所有新行加上条纹,并将输入的文本作为一个长行处理:

text: >
   This is a really long text
   that spans multiple lines (but preserves new lines).
   It does not need to be escaped with special brackets,
   CDATA tags, or anything like that

除了这两个指令之外,你还可以使用竖线和加号(|+),它给位于前面的空格加上条纹,保留新行和末尾的空格,还可以使用大于号和减号(>-),它给所有的空格加上条纹。