Awọn igbesẹ 10 si YAML Zen

Gbogbo wa ni ife Ansible, sugbon Ansible ni YAML. Awọn ọna kika pupọ lo wa fun awọn faili atunto: awọn atokọ ti awọn iye, awọn orisii iye paramita, awọn faili INI, YAML, JSON, XML ati ọpọlọpọ awọn miiran. Sibẹsibẹ, fun awọn idi pupọ ninu gbogbo wọn, YAML nigbagbogbo ni a ka ni pataki paapaa nira. Ni pataki, laibikita minimalism onitura rẹ ati awọn agbara iwunilori fun ṣiṣẹ pẹlu awọn iye ipo ipo, ilana YAML le jẹ didanubi pẹlu ọna bii Python si indentation.

Awọn igbesẹ 10 si YAML Zen

Ti YAML ba binu rẹ, o le — ati pe o yẹ! - ṣe awọn igbesẹ 10 wọnyi lati dinku ibanujẹ rẹ si ipele itẹwọgba ati ṣubu ni ifẹ pẹlu YAML. Gẹgẹbi o ṣe yẹ atokọ yii, awọn imọran mẹwa wa yoo jẹ nọmba lati ibere, a yoo ṣafikun iṣaro ati awọn iṣe ti ẹmi ni ifẹ 😉

0. Jẹ ki olootu rẹ ṣiṣẹ

Ko ṣe pataki kini olootu ọrọ ti o ni, o ṣee ṣe o kere ju ohun itanna kan fun ṣiṣẹ pẹlu YAML. Ti o ko ba ni ọkan, wa ki o fi sii lẹsẹkẹsẹ. Akoko ti o lo wiwa ati iṣeto yoo san ni ọpọlọpọ igba ni gbogbo igba ti o ni lati ṣatunkọ YAML.

Fun apẹẹrẹ, olootu Atomu ṣe atilẹyin YAML nipasẹ aiyipada, ṣugbọn fun GNU Emacs iwọ yoo ni lati fi awọn idii afikun sii, fun apẹẹrẹ, yaml-modus.

Awọn igbesẹ 10 si YAML Zen

Emacs ni ipo YAML ati ifihan awọn aaye.

Ti olootu ayanfẹ rẹ ko ba ni ipo YAML, lẹhinna diẹ ninu awọn iṣoro le ṣee yanju nipasẹ ṣiṣẹ pẹlu awọn eto. Fun apẹẹrẹ, olootu ọrọ GNOME boṣewa Gedit ko ni ipo YAML, ṣugbọn nipasẹ aiyipada o ṣe afihan sintasi YAML ati gba ọ laaye lati tunto iṣẹ pẹlu awọn indentations:

Awọn igbesẹ 10 si YAML Zen

Ṣiṣeto awọn indents ni Gedit.

Ohun itanna kan drawspaces fun Gedit, ṣafihan awọn aaye bi awọn aami, imukuro awọn ambiguities pẹlu awọn ipele indentation.

Ni awọn ọrọ miiran, lo akoko kikọ nipa olootu ayanfẹ rẹ. Wa ohun ti oun tabi agbegbe idagbasoke rẹ ni lati funni fun ṣiṣẹ pẹlu YAML, ati lo awọn ẹya yẹn. Dajudaju iwọ kii yoo kabamọ.

1. Lo kan linter

Ni deede, awọn ede siseto ati awọn ede isamisi lo sintasi asọtẹlẹ. Awọn kọnputa dara ni asọtẹlẹ, eyiti o jẹ idi ti imọran ti lintera. Ti o ba jẹ pe ni awọn ọdun 40 ti aye rẹ ti kọja rẹ ati pe o ko tun lo linter YAML kan, lẹhinna o to akoko lati gbiyanju yamllint.

Fi sori ẹrọ yamllint O le lo oluṣakoso package Linux boṣewa. Fun apẹẹrẹ, in Red Hat Idawọlẹ Linux 8 tabi Fedora o ṣe bi eleyi:

$ sudo dnf install yamllint

Lẹhinna o kan ṣiṣẹ yamllint, gbigbe faili YAML lọ lati ṣayẹwo. Eyi ni ohun ti o dabi ti o ba kọja faili kan pẹlu aṣiṣe kan si linter:

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

Awọn nọmba ti o wa ni apa osi kii ṣe akoko, ṣugbọn awọn ipoidojuko ti aṣiṣe: ila ati nọmba ọwọn. Apejuwe aṣiṣe le ma sọ ​​fun ọ ohunkohun, ṣugbọn o mọ pato ibi ti o wa. Kan wo aaye yii ninu koodu naa, ati pe o ṣee ṣe pe ohun gbogbo yoo di mimọ.

Nigbati yamllint ko rii awọn aṣiṣe ninu faili kan, ko si nkan ti a tẹ si iboju. Ti iru ipalọlọ bẹẹ ba dẹruba ọ ati pe o fẹ esi diẹ sii, lẹhinna o le ṣiṣẹ linter pẹlu aṣẹ iwoyi ipo nipasẹ ampersand meji (&&), bii eyi:

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

Ni POSIX, ampersand meji kan n jo ti ati pe nikan ti aṣẹ iṣaaju ba pada 0. Ati pe yamllint kan da nọmba awọn aṣiṣe ti a rii pada, eyiti o jẹ idi ti gbogbo igbelewọn ipo yii ṣiṣẹ.

2. Kọ ni Python, kii ṣe YAML

Ti YAML ba binu rẹ gaan, maṣe kọ sinu rẹ, ni otitọ. O ṣẹlẹ pe YAML jẹ ọna kika nikan ti ohun elo naa loye. Ṣugbọn paapaa ninu ọran yii, ko ṣe pataki lati ṣẹda faili YAML kan. Kọ sori ohun ti o nifẹ ati lẹhinna yipada. Fun apẹẹrẹ, ile-ikawe nla kan wa fun Python pyaml ati awọn ọna iyipada meji: iyipada ti ara ẹni ati iyipada nipasẹ awọn iwe afọwọkọ.

Iyipada ti ara ẹni

Ni idi eyi, faili data tun jẹ iwe afọwọkọ Python ti o ṣe ipilẹṣẹ YAML. Ọna yii dara julọ fun awọn eto data kekere. O kan kọ data JSON sinu oniyipada Python, ṣaju rẹ pẹlu itọsọna agbewọle, ati ni ipari faili naa ṣafikun awọn laini mẹta lati ṣe iṣejade.

#!/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

Bayi a ṣiṣe faili yii ni Python ati gba faili 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

Eyi wulo YAML ni pipe, ṣugbọn yamllint yoo kilo fun ọ pe ko bẹrẹ pẹlu -. O dara, eyi le ṣe atunṣe ni rọọrun pẹlu ọwọ tabi yipada diẹ ninu iwe afọwọkọ Python.

Iyipada nipasẹ awọn iwe afọwọkọ

Ni idi eyi, a kọkọ kọ ni JSON, ati lẹhinna ṣiṣẹ oluyipada bi iwe afọwọkọ Python lọtọ, eyiti o ṣe agbejade YAML bi iṣelọpọ. Ti a ṣe afiwe si ọna iṣaaju, ọna yii ṣe iwọn dara julọ, nitori iyipada ti yato si data naa.

Ni akọkọ, jẹ ki a ṣẹda faili JSON kan example.json, fun apẹẹrẹ, o le gba lati 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"
			}
		  }
		}
	  }
	}

Lẹhinna a yoo ṣẹda iwe afọwọkọ oluyipada ti o rọrun ati fipamọ labẹ orukọ json2yaml.py. Iwe afọwọkọ yii gbejade mejeeji YAML ati awọn modulu JSON Python, o si gbe faili JSON kan pato olumulo kan, ṣe iyipada, ati kọ data si faili 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()

Ṣafipamọ iwe afọwọkọ yii ni ọna eto ati ṣiṣe bi o ti nilo:

$ ~/bin/json2yaml.py example.json

3. Pari pupọ ati nigbagbogbo

Nigba miiran o wulo lati wo iṣoro kan lati igun oriṣiriṣi. Ti o ba ni wahala ti o nsoju awọn ibatan laarin data rẹ ni YAML, o le yi pada fun igba diẹ si nkan ti o faramọ diẹ sii.

Fun apẹẹrẹ, ti o ba ni itunu lati ṣiṣẹ pẹlu awọn atokọ iwe-itumọ tabi JSON, o le yi YAML pada si JSON pẹlu awọn aṣẹ meji kan ninu ikarahun Python ibaraenisepo. Jẹ ki a sọ pe o ni faili YAML mydata.yaml, lẹhinna eyi ni ohun ti yoo dabi:

$ 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.'}

O le wa ọpọlọpọ awọn apẹẹrẹ miiran lori koko yii. Ni afikun, ọpọlọpọ awọn oluyipada ori ayelujara ati awọn parsers agbegbe wa. Nitorinaa ma ṣe ṣiyemeji lati tun ṣe data naa nigbati o rii nikan jumble ti ko ni oye ninu rẹ.

4. Ka awọn alaye lẹkunrẹrẹ

Pada si YAML lẹhin isinmi pipẹ, o wulo lati ṣabẹwo yaml.org ati ki o tun-ka awọn pato (awọn alaye lẹkunrẹrẹ). Ti o ba ni awọn iṣoro pẹlu YAML, ṣugbọn ko ti ni ayika si sipesifikesonu, lẹhinna o to akoko lati ṣatunṣe ipo yii. Awọn alaye lẹkunrẹrẹ jẹ iyalẹnu rọrun lati kọ, ati awọn ibeere sintasi jẹ alaworan pẹlu nọmba nla ti awọn apẹẹrẹ ni ILE 6.

5. afarape-konfigi

Nigbati o ba n kọ iwe tabi nkan kan, o wulo nigbagbogbo lati kọkọ ṣe apẹrẹ ilana alakọbẹrẹ, o kere ju ni irisi tabili awọn akoonu. Bakanna ni pẹlu YAML. O ṣeese, o ni imọran kini data nilo lati kọ sinu faili YAML, ṣugbọn iwọ ko loye gaan bi o ṣe le sopọ pẹlu ara wọn. Nitorinaa, ṣaaju ṣiṣe aworan YAML, fa pseudo-config.

Afarape-konfigi jẹ iru si koodu afarape, nibiti o ko ni lati ṣe aniyan nipa eto tabi indentation, awọn ibatan obi-ọmọ, ogún ati itẹ-ẹiyẹ. O jẹ kanna nibi: o fa iterations ti data bi wọn ṣe dide ni ori rẹ.

Awọn igbesẹ 10 si YAML Zen

Awọn olupilẹṣẹ atokọ ti atunto-iṣeto (Martin ati Tabitha) ati awọn ọgbọn wọn (awọn ede siseto: Python, Perl, Pascal ati Lisp, Fortran, Erlang, lẹsẹsẹ).

Lẹhin iyaworan apseudo-config lori nkan ti iwe kan, farabalẹ ṣe itupalẹ rẹ ati, ti ohun gbogbo ba wa ni ibere, ṣe ọna kika rẹ ni irisi faili YAML ti o wulo.

6. Awọn taabu la awọn alafo atayanyan

Iwọ yoo ni lati yanju atayanyan naa "Awọn taabu tabi awọn aaye?". Kii ṣe ni ori agbaye, ṣugbọn nikan ni ipele ti agbari rẹ, tabi o kere ju iṣẹ akanṣe kan. Ko ṣe pataki boya eyi pẹlu lilo ilana-ifiweranṣẹ pẹlu iwe afọwọkọ sed kan, ṣeto awọn olootu ọrọ lori awọn ẹrọ pirogirama, tabi ni gbogbo agbaye gbigba awọn owo-owo ti ibamu ti o muna pẹlu awọn ilana linter labẹ irokeke ikọsilẹ, ṣugbọn gbogbo awọn ọmọ ẹgbẹ ti ẹgbẹ rẹ ti o wa ninu rẹ. ọna kan tabi omiran ti o jọmọ YAML gbọdọ lo awọn aaye nikan (gẹgẹ bi o ṣe nilo nipasẹ sipesifikesonu YAML).

Ninu olootu ọrọ deede eyikeyi, o le tunto awọn taabu atunṣe adaṣe si nọmba kan ti awọn aye, nitorinaa awọn olutẹtisi bọtini yoo rudurudu Tab o ko ni lati bẹru.

Bi gbogbo YAML korira mọ daradara, o ko ba le ri iyato laarin awọn taabu ati awọn alafo loju iboju. Ati nigbati nkan ko ba han, o jẹ igbagbogbo ohun ti eniyan ranti, lẹhin ti wọn ti ṣe lẹsẹsẹ, ṣayẹwo ati imukuro gbogbo awọn iṣoro miiran ti o ṣeeṣe. Wakati kan ti akoko ti o lo wiwa wiwa ọna kika tabi bulọọki ti awọn aye n pariwo pe o nilo ni iyara lati ṣẹda eto imulo kan fun lilo ọkan tabi omiiran, ati lẹhinna ṣe imuse ayẹwo nja ti o ni agbara fun ibamu pẹlu rẹ (fun apẹẹrẹ, nipasẹ kio Git lati fi ipa mu nipasẹ linter).

7. Kere jẹ diẹ sii (tabi diẹ sii kere si)

Diẹ ninu awọn eniyan nifẹ lati kọ ni YAML nitori pe o tẹnuba eto. Ni akoko kanna, wọn lo indentation lati ṣe afihan awọn bulọọki ti data. Eyi jẹ iru ete itanjẹ lati ṣe afarawe awọn ede isamisi ti o lo awọn apinfunni ti o fojuhan.

Eyi jẹ ẹya apẹẹrẹ ti iru be lati Ansible iwe:

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

Fun diẹ ninu awọn, aṣayan yii ṣe iranlọwọ fun wọn lati ṣeto eto YAML ni ori wọn; fun awọn miiran, ni ilodi si, o binu wọn pẹlu ọpọlọpọ ti ko wulo, ni ero wọn, awọn indents.

Ṣugbọn ti o ba jẹ oniwun iwe YAML ati pe o ni iduro lati ṣetọju rẹ, lẹhinna iwọ ati iwọ nikan gbọdọ setumo bi o lati lo indentation. Ti o ba binu nipasẹ fifẹ nla, jẹ ki o kere ju ti o ṣeeṣe ni ibamu si sipesifikesonu YAML. Fun apẹẹrẹ, faili ti o wa loke lati iwe Ansible le jẹ tunkọ bii eyi laisi pipadanu eyikeyi:

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

8. Lo òfo

Ti o ba tun awọn aṣiṣe kanna ṣe nigbagbogbo nigbati o ba n kun faili YAML kan, o jẹ oye lati fi awoṣe sii sinu rẹ bi asọye. Lẹhinna nigbamii ti o le daakọ awoṣe yii nirọrun ki o tẹ data gidi sii nibẹ, fun apẹẹrẹ:

---
# - <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. Lo nkan ti o yatọ

Ti ohun elo naa ko ba ni idaduro lori rẹ, lẹhinna o le tọ lati yi YAML pada si ọna kika ti o yatọ. Ni akoko pupọ, awọn faili iṣeto le dagba ara wọn ati lẹhinna o dara lati yi wọn pada si awọn iwe afọwọkọ ti o rọrun ni Lua tabi Python.

YAML jẹ ohun nla ti ọpọlọpọ eniyan nifẹ fun minimalism ati ayedero rẹ, ṣugbọn o jinna si ohun elo kan ṣoṣo ninu ohun ija rẹ. Nitorina nigbami o le kọ. Awọn ile ikawe itọka rọrun lati wa fun YAML, nitorinaa ti o ba funni ni awọn aṣayan ijira irọrun, awọn olumulo rẹ yoo ye ikuna yii lainidi.

Ti o ko ba le ṣe laisi YAML, lẹhinna mu awọn imọran 10 wọnyi ki o bori ikorira rẹ ti YAML lekan ati fun gbogbo!

orisun: www.habr.com

Fi ọrọìwòye kun