共通部分の切り出し

key: &keyのようにキーの横に&block-nameと書くとそのブロックをそれ以降で使い回せるようになります。これは場所はどこでもいいです。以下のbar,quux,piyoはどれも有効です。

foo:
  bar: &bar
    value: value
  baz:
    qux:
      quux: &quux
        value: value
    hoge:
      fuga:
        piyo: &piyo

オブジェクトに埋め込む

commonという共通ブロックを設定しました。

common: &common
  one: one
  two: two

このように<<: *block-nameという記法で使えます。

foo:
  zero: zero
  <<: *common
  three: three

これは JSON にするとこのような感じです。fooブロックの中に共通ブロックのonetwoを入れれました。

{
  "foo": {
    "zero": "zero", 
    "one": "one",
    "two": "two",
    "three": "three"
  }, 
  "common": {
    "two": "two", 
    "one": "one"
  }
}

配列に埋め込む

配列の場合は- *block-nameという記法で埋め込みます。commonは同じものを使います。また例です。

foo:
  - zero: zero
  - *common
  - three:
      value: value

JSON にするとこのような感じです。onetwoというキーを持ったオブジェクトがちゃんと入っているのが分かります。

{
  "foo": [
    {
      "zero": "zero"
    }, 
    {
      "one": "one"
      "two": "two", 
    }, 
    {
      "three": {
        "value": "value"
      }
    }
  ], 
  "common": {
    "two": "two", 
    "one": "one"
  }
}

yamllint

yamllint を使うとプロジェクトで YAML の書き方を統一しやすくなります。

インストール

pipコマンドで入れます。

pipe install yamllint

これでyamllintコマンドが使えるようになります。

使い方

コマンドの引数に検証したいファイルを指定することで、そのファイルに対して検証が行えます。

yamllint foo.yml bar/baz.yml

引数に.を渡すことでディレクトリ以下のすべての.yaml.yml.yamllintに対して検証することもできます。

yamllint .
# yamllint foo.yml bar/baz.yml ...

検証ルール

デフォルトのルールプリセットは以下のようになってます。各ルールについては yamllint.readthedocs.io/en/stable/rules.html を参照。

rules:
  braces: enable
  brackets: enable
  colons: enable
  commas: enable
  comments:
    level: warning
  comments-indentation:
    level: warning
  document-end: disable
  document-start:
    level: warning
  empty-lines: enable
  empty-values: disable
  hyphens: enable
  indentation: enable
  key-duplicates: enable
  key-ordering: disable
  line-length: enable
  new-line-at-end-of-file: enable
  new-lines: enable
  octal-values: disable
  quoted-strings: disable
  trailing-spaces: enable
  truthy:
    level: warning

検証ルールプリセットは自分で好きに設定することができます。例えば.yamllintrc.ymlのようなファイル名で以下の内容だとします。

extends: default

rules:
  document-start: 
    present: true
  line-length:
    max: 80
    allow-non-breakable-words: true

yamllintコマンドを使う際に-c, --config-fileで指定して使います。

yamllint -c .yamllintrc.yml .

設定ファイルを.yamllintとして設置すると、yamllintはこれを自動的に読み込むようになります。

yamllint -c .yamllint .
# は以下と同じ
# yamllint . 

無視設定

設定ファイルのignoreセクションに無視したいファイル名を記載します。

ignore: |
  ignored-file.yml
  ignored-directory/*.yml

またコメントを使ってあるファイルで「この部分だけこのルールを無視したい」な事もできます。# yamllint disable-lineコメントを前の行に配置すると、次の行に対して特定のルールを無視できます。

# yamllint disable-line rule:line-length
key1: value1....

これは同じ行の後ろに配置することもできます。

key1: value1.... # yamllint disable-line rule:line-length

複数行に対して無視したい場合は# yamllint disableコメントを使います。こちらの場合はルールを無効化するとファイルの最後まで無視されるようになっていしまうので、# yamllint enableコメントを使って再度有効にする必要がでてくるかもしれません。

# yamllint disable rule:line-length
key1:
  - value1....
  - value2....
  - value3....
# yamllint enable rule:line-length

どちらもrule:...は省略可能です。ちゃんとする必要があるならば、明確さの為に記述すると良いと思います。

てっとり早く yamllint を試す環境

nju33-com/example-yamllint Docker を使った環境を作れます。