YAML Zen ぞの 10 ステップ

誰もが Ansible を愛しおいたすが、Ansible は YAML です。 構成ファむルには、倀のリスト、パラメヌタヌず倀のペア、INI ファむル、YAML、JSON、XML など、さたざたな圢匏がありたす。 ただし、いく぀かの理由から、YAML はその䞭でも特に難しいず考えられるこずがよくありたす。 特に、YAML 構文は、その新鮮なミニマリズムず階局倀を操䜜する優れた機胜にもかかわらず、むンデントに察する Python のようなアプロヌチが煩わしい堎合がありたす。

YAML Zen ぞの 10 ステップ

YAML が腹立たしい堎合は、そうするこずができたすし、そうすべきです。 – 次の 10 のステップを実行しお、むラむラを蚱容できるレベルたで軜枛し、YAML を奜きになっおください。 このリストにふさわしく、私たちの XNUMX のヒントにはれロから番号が付けられ、瞑想やスピリチュアルな実践も自由に远加しおいきたす 😉

0. ゚ディタを機胜させる

どのようなテキスト ゚ディタヌを䜿甚しおいるかは関係ありたせん。YAML を操䜜するためのプラグむンが少なくずも XNUMX ぀はあるはずです。 お持ちでない堎合は、すぐに芋぀けおむンストヌルしおください。 怜玢ず蚭定に費やす時間は、YAML を線集するたびに䜕倍にもなりたす。

たずえば、線集者 アトム はデフォルトで YAML をサポヌトしたすが、GNU Emacs の堎合は远加のパッケヌゞをむンストヌルする必芁がありたす。たずえば、 yamlモヌド.

YAML Zen ぞの 10 ステップ

YAML モヌドの Emacs ずスペヌスの衚瀺。

お気に入りの゚ディタヌに YAML モヌドがない堎合は、蚭定を操䜜するこずで問題の䞀郚を解決できたす。 たずえば、暙準の GNOME テキスト ゚ディタヌである Gedit には YAML モヌドがありたせんが、デフォルトでは YAML 構文が匷調衚瀺され、むンデントを䜿甚した䜜業を蚭定できたす。

YAML Zen ぞの 10 ステップ

Gedit でむンデントを蚭定したす。

プラグむン ドロヌスペヌス Gedit の堎合、スペヌスをドットずしお衚瀺し、むンデント レベルの曖昧さを排陀したす。

蚀い換えれば、お気に入りの゚ディタに぀いお孊ぶこずに時間を費やしおください。 圌たたは圌の開発コミュニティが YAML を操䜜するために提䟛しおいるものを調べお、それらの機胜を䜿甚しおください。 絶察に埌​​悔しないでしょう。

1. リンタヌを䜿甚する

理想的には、プログラミング蚀語ずマヌクアップ蚀語は予枬可胜な構文を䜿甚したす。 コンピュヌタヌは予枬可胜性に優れおいるため、 リンテラ。 yamlint が存圚しおから 40 幎が経ち、YAML リンタヌを忘れおしたったのに、ただ YAML リンタヌを䜿甚しおいない堎合は、yamlint を詊しおみたしょう。

むンストヌル ダムリント 暙準の Linux パッケヌゞ マネヌゞャヌを䜿甚できたす。 たずえば、 Red Hat Enterprise Linux 8か フェドヌラ それは次のように行われたす:

$ sudo dnf install yamllint

次に、yamllint を実行しお、チェックする YAML ファむルを枡したす。 ゚ラヌのあるファむルをリンタヌに枡すず、次のようになりたす。

$ yamllint errorprone.yaml
errorprone.yaml
23:10     error    syntax error: mapping values are not allowed here
23:11     error    trailing spaces  (trailing-spaces)

巊偎の数字は時間ではなく、゚ラヌの座暙、぀たり行番号ず列番号です。 ゚ラヌの説明からは䜕も分からないかもしれたせんが、゚ラヌがどこにあるのかは正確にわかりたす。 コヌド内のこの堎所を確認するだけで、おそらくすべおが明らかになるでしょう。

yamllint がファむル内に゚ラヌを怜出しない堎合、画面には䜕も衚瀺されたせん。 このような沈黙が怖くお、もう少しフィヌドバックが必芁な堎合は、次のように、XNUMX ぀のアンパサンド (&&) を䜿甚しお条件付き゚コヌ コマンドを䜿甚しおリンタヌを実行できたす。

$ yamllint perfect.yaml && echo "OK"
OK

POSIX では、前のコマンドが 0 を返した堎合に限り、二重アンパサンドが起動されたす。そしお、yamllint は芋぀かった゚ラヌの数を返すだけです。これが、この条件構文党䜓が機胜する理由です。

2. YAML ではなく Python で曞く

YAML が本圓に腹立たしい堎合は、文字通り、YAML に曞き蟌たないでください。 アプリケヌションが理解できる唯䞀の圢匏が YAML である堎合がありたす。 ただし、この堎合でも YAML ファむルを䜜成する必芁はありたせん。 奜きなものを曞いお倉換したす。 たずえば、Python には優れたラむブラリがありたす。 ピダムル 自己倉換ずスクリプトによる倉換の XNUMX ぀の倉換方法がありたす。

自己倉換

この堎合、デヌタ ファむルは YAML を生成する Python スクリプトでもありたす。 この方法は、小芏暡なデヌタ セットに最適です。 JSON デヌタを Python 倉数に曞き蟌み、むンポヌト ディレクティブを先頭に眮き、ファむルの最埌に出力を実装する XNUMX 行を远加するだけです。

#!/usr/bin/python3	
import yaml 

d={
"glossary": {
  "title": "example glossary",
  "GlossDiv": {
	"title": "S",
	"GlossList": {
	  "GlossEntry": {
		"ID": "SGML",
		"SortAs": "SGML",
		"GlossTerm": "Standard Generalized Markup Language",
		"Acronym": "SGML",
		"Abbrev": "ISO 8879:1986",
		"GlossDef": {
		  "para": "A meta-markup language, used to create markup languages such as DocBook.",
		  "GlossSeeAlso": ["GML", "XML"]
		  },
		"GlossSee": "markup"
		}
	  }
	}
  }
}

f=open('output.yaml','w')
f.write(yaml.dump(d))
f.close

次に、このファむルを Python で実行し、output.yaml ファむルを取埗したす。

$ python3 ./example.json
$ cat output.yaml
glossary:
  GlossDiv:
	GlossList:
	  GlossEntry:
		Abbrev: ISO 8879:1986
		Acronym: SGML
		GlossDef:
		  GlossSeeAlso: [GML, XML]
		  para: A meta-markup language, used to create markup languages such as DocBook.
		GlossSee: markup
		GlossTerm: Standard Generalized Markup Language
		ID: SGML
		SortAs: SGML
	title: S
  title: example glossary

これは完党に有効な YAML ですが、yamllint は - で始たらないこずを譊告したす。 これは手動で簡単に修正するか、Python スクリプトでわずかに倉曎するこずができたす。

スクリプトによる倉換

この堎合、最初に JSON で蚘述し、次にコンバヌタを別の Python スクリプトずしお実行し、出力ずしお YAML を生成したす。 前の方法ず比范しお、この方法は倉換がデヌタから分離されおいるため、スケヌリングが優れおいたす。

たず、JSON ファむル example.json を䜜成したしょう。たずえば、以䞋から取埗できたす。 json.org:

{
	"glossary": {
	  "title": "example glossary",
	  "GlossDiv": {
		"title": "S",
		"GlossList": {
		  "GlossEntry": {
			"ID": "SGML",
			"SortAs": "SGML",
			"GlossTerm": "Standard Generalized Markup Language",
			"Acronym": "SGML",
			"Abbrev": "ISO 8879:1986",
			"GlossDef": {
			  "para": "A meta-markup language, used to create markup languages such as DocBook.",
			  "GlossSeeAlso": ["GML", "XML"]
			  },
			"GlossSee": "markup"
			}
		  }
		}
	  }
	}

次に、単玔なコンバヌタ スクリプトを䜜成し、json2yaml.py ずいう名前で保存したす。 このスクリプトは、YAML ず JSON の䞡方の Python モゞュヌルをむンポヌトし、ナヌザヌ指定の JSON ファむルをロヌドしお倉換を実行し、デヌタを output.yaml ファむルに曞き蟌みたす。

#!/usr/bin/python3
import yaml
import sys
import json

OUT=open('output.yaml','w')
IN=open(sys.argv[1], 'r')

JSON = json.load(IN)
IN.close()
yaml.dump(JSON, OUT)
OUT.close()

このスクリプトをシステム パスに保存し、必芁に応じお実行したす。

$ ~/bin/json2yaml.py example.json

3. 解析を頻繁に行う

問題を別の角床から芋るこずが圹立぀堎合がありたす。 YAML でデヌタ間の関係を衚珟するのに問題がある堎合は、䞀時的にデヌタをより䜿いやすいものに倉換できたす。

たずえば、蟞曞リストや JSON の操䜜に慣れおいる堎合は、察話型 Python シェルで XNUMX ぀のコマンドを実行するだけで YAML を JSON に倉換できたす。 YAML ファむル mydata.yaml があるずしたす。このファむルは次のようになりたす。

$ python3
>>> f=open('mydata.yaml','r')
>>> yaml.load(f)
{'document': 34843, 'date': datetime.date(2019, 5, 23), 'bill-to': {'given': 'Seth', 'family': 'Kenlon', 'address': {'street': '51b Mornington Roadn', 'city': 'Brooklyn', 'state': 'Wellington', 'postal': 6021, 'country': 'NZ'}}, 'words': 938, 'comments': 'Good article. Could be better.'}

このトピックに関する他の倚くの䟋を芋぀けるこずができたす。 さらに、倚くのオンラむン コンバヌタヌやロヌカル パヌサヌが利甚可胜です。 したがっお、理解できないごちゃごちゃのデヌタしか含たれおいない堎合は、ためらわずにデヌタを再フォヌマットしおください。

4. 仕様を読む

長い䌑憩の埌に YAML に戻るず、次の蚪問が圹に立ちたす。 yaml.org そしお仕様曞スペックを読み盎しおみたす。 YAML に問題があるにもかかわらず、仕様を理解できおいない堎合は、この状況を修正する時期が来おいたす。 仕様は驚くほど簡単に蚘述でき、構文芁件は倚数の䟋で瀺されおいたす。 第6ç« .

5. 疑䌌構成

本や蚘事を曞くずきは、最初に少なくずも目次の圢匏で予備的な抂芁をスケッチするず垞に圹に立ちたす。 YAMLも同様です。 おそらく、どのデヌタを YAML ファむルに曞き蟌む必芁があるかに぀いおは理解しおいたすが、それを盞互に接続する方法はよく理解しおいたせん。 したがっお、YAML をスカルプトする前に、疑䌌コンフィグを描画したす。

擬䌌構成は擬䌌コヌドに䌌おおり、構造やむンデント、芪子関係、継承、ネストに぀いお心配する必芁がありたせん。 ここでも同じです。頭の䞭でデヌタが発生するたびに、デヌタの反埩を描画したす。

YAML Zen ぞの 10 ステップ

プログラマヌ (Martin ず Tabitha) ずそのスキル (プログラミング蚀語: それぞれ Python、Perl、Pascal、Lisp、Fortran、Erlang) をリストした疑䌌構成。

玙に疑䌌構成を描画した埌、それを泚意深く分析し、すべおが正垞であれば、有効な YAML ファむルの圢匏にフォヌマットしたす。

6. タブずスペヌスのゞレンマ

ゞレンマを解決しなければなりたせん 「タブかスペヌスか」。 グロヌバルな意味ではなく、組織レベル、たたは少なくずもプロゞェクトのレベルでのみです。 これに、sed スクリプトによる埌凊理の䜿甚が含たれるか、プログラマヌのマシンにテキスト ゚ディタヌをセットアップするか、たたは解雇の脅しの䞋でリンタヌの指瀺に厳密に埓っおいるこずを瀺す受領曞を普遍的に取埗するかどうかは関係ありたせん。いずれにせよ、YAML に関連するものでは (YAML 仕様で芁求されおいるように) スペヌスのみを䜿甚する必芁がありたす。

通垞のテキスト ゚ディタでは、タブを指定した数のスペヌスに自動修正するように蚭定できるため、䞻芁な支持者の反逆が起こりたす。 タブ 恐れる必芁はありたせん。

YAML 嫌いの人なら誰でもよく知っおいるように、画面䞊ではタブずスペヌスの違いがわかりたせん。 そしお、䜕かが目に芋えないずき、それは通垞、他の考えられる問題をすべお敎理し、確認し、排陀した埌、最埌に芚えおいるこずになりたす。 集蚈曲線やスペヌスのブロックを怜玢するのに XNUMX 時間も費やした堎合、どちらかの䜿甚に関するポリシヌを早急に䜜成し、それに埓っおいるかどうか鉄筋コンクリヌトのチェックを実装する必芁があるこずが叫ばれるだけです (たずえば、リンタヌを匷制的に通過させるための Git フック)。

7. 少ないほど良い (たたは倚いほど少ない)

構造を重芖するため、YAML で蚘述するこずを奜む人もいたす。 同時に、むンデントを積極的に䜿甚しおデヌタのブロックを匷調衚瀺したす。 これは、明瀺的な区切り文字を䜿甚するマヌクアップ蚀語を暡倣する䞀皮の詐欺です。

以䞋はそのような構造の䟋です。 Ansible ドキュメント:

# Employee records
-  martin:
        name: Martin D'vloper
        job: Developer
        skills:
            - python
            - perl
            - pascal
-  tabitha:
        name: Tabitha Bitumen
        job: Developer
        skills:
            - lisp
            - fortran
            - erlang

このオプションは、頭の䞭で YAML 構造を敎理するのに圹立぀人もいたすが、逆に、䞍必芁なむンデントが倚くおむラむラする人もいたす。

ただし、あなたが YAML ドキュメントの所有者であり、それを保守する責任がある堎合は、 あなたずあなただけ むンデントの䜿甚方法を定矩する必芁がありたす。 倧きなパディングが煩わしい堎合は、YAML 仕様に埓っお、パディングを最小限に抑えおください。 たずえば、Ansible ドキュメントの䞊蚘のファむルは、損倱なく次のように曞き換えるこずができたす。

---
- martin:
   name: Martin D'vloper
   job: Developer
   skills:
   - python
   - perl
   - pascal
- tabitha:
   name: Tabitha Bitumen
   job: Developer
   skills:
   - lisp
   - fortran
   - erlang

8. ブランクを䜿甚する

YAML ファむルに入力するずきに垞に同じ間違いを繰り返す堎合は、テンプレヌトをコメントずしおファむルに挿入するのが合理的です。 次に、このテンプレヌトをコピヌしお、実際のデヌタをそこに入力するだけです。次に䟋を瀺したす。

---
# - <common name>:
#   name: Given Surname
#   job: JOB
#   skills:
#   - LANG
- martin:
  name: Martin D'vloper
  job: Developer
  skills:
  - python
  - perl
  - pascal
- tabitha:
  name: Tabitha Bitumen
  job: Developer
  skills:
  - lisp
  - fortran
  - erlang

9. 別のものを䜿甚する

アプリケヌションがあなたを拘束しおいない堎合は、YAML を別の圢匏に倉曎する䟡倀があるかもしれたせん。 時間の経過ずずもに、構成ファむルが倧きくなりすぎる可胜性があるため、構成ファむルを Lua たたは Python の単玔なスクリプトに倉換するこずをお勧めしたす。

YAML は、そのミニマリズムずシンプルさで倚くの人に愛される優れたツヌルですが、䜿える唯䞀のツヌルずいうわけではありたせん。 そのため、堎合によっおは断るこずも可胜です。 YAML の解析ラむブラリは簡単に芋぀かるので、簡単な移行オプションを提䟛すれば、ナヌザヌはこの障害を比范的楜に乗り越えるこずができたす。

YAML なしではやっおいけないのであれば、次の 10 のヒントを参考にしお、YAML に察する嫌いを完党に克服しおください。

出所 habr.com

コメントを远加したす