10 passi għal YAML Zen

Ilkoll inħobbu lil Ansible, iżda Ansible huwa YAML. Hemm ħafna formati għall-fajls ta 'konfigurazzjoni: listi ta' valuri, pari parametri-valur, fajls INI, YAML, JSON, XML u ħafna oħrajn. Madankollu, għal diversi raġunijiet minn dawn kollha, YAML spiss jitqies partikolarment diffiċli. B'mod partikolari, minkejja l-minimaliżmu iġjeniċi u l-kapaċitajiet impressjonanti tagħha biex taħdem b'valuri ġerarkiċi, is-sintassi YAML tista 'tkun tedjanti bl-approċċ tagħha bħal Python għall-indentazzjoni.

10 passi għal YAML Zen

Jekk il-YAML tgħaxxaqek, tista'—u għandek! – ħu l-10 passi li ġejjin biex tnaqqas il-frustrazzjoni tiegħek għal livell aċċettabbli u tħobb il-YAML. Kif jixraq lil din il-lista, l-għaxar ponot tagħna se jkunu nnumerati mill-bidu, se nżidu l-meditazzjoni u l-prattiċi spiritwali kif riedu 😉

0. Agħmel l-editur tiegħek jaħdem

Ma jimpurtax liema editur tat-test għandek, probabbilment hemm mill-inqas plugin wieħed biex taħdem ma 'YAML. Jekk m'għandekx waħda, sibha u installaha immedjatament. Il-ħin mgħoddi fit-tiftix u l-istabbiliment se jħallas ħafna drabi kull darba li jkollok teditja YAML.

Per eżempju, editur Atom jappoġġja YAML awtomatikament, iżda għal GNU Emacs ser ikollok tinstalla pakketti addizzjonali, pereżempju, yaml-mode.

10 passi għal YAML Zen

Emacs fil-mod YAML u wiri spazji.

Jekk l-editur favorit tiegħek m'għandux modalità YAML, allura xi wħud mill-problemi jistgħu jissolvew billi taħdem mas-settings. Pereżempju, l-editur tat-test standard GNOME Gedit m'għandux modalità YAML, iżda b'mod awtomatiku jenfasizza s-sintassi YAML u jippermettilek tikkonfigura x-xogħol b'indentazzjonijiet:

10 passi għal YAML Zen

L-issettjar ta' inċiżi f'Gedit.

Plugin drawspaces għal Gedit, juri l-ispazji bħala tikek, u jelimina l-ambigwitajiet b'livelli ta 'indentazzjoni.

Fi kliem ieħor, qattgħu ħin titgħallem dwar l-editur favorit tiegħek. Skopri x'għandhom x'joffru hu jew il-komunità ta' żvilupp tiegħu biex jaħdmu ma' YAML, u uża dawk il-karatteristiċi. Żgur li mhux se jiddispjaċih.

1. Uża linter

Idealment, il-lingwi tal-ipprogrammar u l-lingwi tal-markup jużaw sintassi prevedibbli. Kompjuters huma tajbin fil-prevedibbiltà, u huwa għalhekk li l-kunċett ta ' lintera. Jekk fl-40 sena tal-eżistenza tiegħu għadda minnek u għadek ma tużax linter YAML, allura wasal iż-żmien li tipprova yamllint.

Installa yamllint Tista 'tuża l-maniġer standard tal-pakkett Linux. Per eżempju, fi Red Hat Enterprise Linux 8 jew Fedora isir hekk:

$ sudo dnf install yamllint

Imbagħad inti sempliċiment tmexxi yamllint, tgħaddiha l-fajl YAML biex tiċċekkja. Dan huwa kif jidher jekk tgħaddi fajl bi żball lill-linter:

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

In-numri fuq ix-xellug mhumiex il-ħin, iżda l-koordinati tal-iżball: in-numru tar-ringiela u l-kolonna. Id-deskrizzjoni ta 'l-iżball tista' ma tgħidlek xejn, imma taf eżatt fejn tinsab. Ħares lejn dan il-post fil-kodiċi, u x'aktarx kollox isir ċar.

Meta yamllint ma jsib l-ebda żball f'fajl, xejn ma jiġi stampat fuq l-iskrin. Jekk silenzju bħal dan ibeżżgħek u trid ftit aktar feedback, allura tista' tmexxi l-linter bil-kmand tal-echo kondizzjonali permezz ta' ampersand doppju (&&), bħal dan:

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

F'POSIX, ampersand doppju jispara jekk u biss jekk il-kmand preċedenti jirritorna 0. U yamllint jirritorna biss in-numru ta 'żbalji misjuba, u huwa għalhekk li din il-kostruzzjoni kondizzjonali kollha taħdem.

2. Ikteb f'Python, mhux YAML

Jekk YAML verament iħażżek, sempliċement tiktebx fiha, litteralment. Jiġri li YAML huwa l-uniku format li l-applikazzjoni tifhem. Iżda anke f'dan il-każ, mhux meħtieġ li jinħoloq fajl YAML. Ikteb fuq dak li tixtieq u mbagħad jikkonvertu. Pereżempju, hemm librerija kbira għal Python pyyaml u żewġ metodi ta 'konverżjoni: awto-konverżjoni u konverżjoni permezz ta' skripts.

Awtokonverżjoni

F'dan il-każ, il-fajl tad-dejta huwa wkoll script Python li jiġġenera YAML. Dan il-metodu huwa l-aktar adattat għal settijiet ta 'dejta żgħar. Sempliċement tikteb id-dejta JSON f'varjabbli Python, prefazjuha b'direttiva ta 'importazzjoni, u fl-aħħar tal-fajl żid tliet linji biex timplimenta l-output.

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

Issa nħaddmu dan il-fajl f'Python u nġibu l-fajl 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

Dan huwa YAML perfettament validu, iżda yamllint iwissuk li ma jibdax b'-. Ukoll, dan jista 'jiġi kkoreġut faċilment manwalment jew immodifikat kemmxejn fl-iskrittura Python.

Konverżjoni permezz ta' skripts

F'dan il-każ, l-ewwel niktbu f'JSON, u mbagħad inħaddmu l-konvertitur bħala script Python separat, li jipproduċi YAML bħala output. Meta mqabbel mal-metodu preċedenti, dan il-metodu jiskala aħjar, peress li l-konverżjoni hija separata mid-data.

L-ewwel, ejja noħolqu fajl JSON example.json, pereżempju, tista 'teħodha minn 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"
			}
		  }
		}
	  }
	}

Imbagħad se noħolqu skript sempliċi ta 'konvertitur u nissejvjah taħt l-isem json2yaml.py. Dan l-iskritt jimporta kemm moduli YAML kif ukoll JSON Python, u jgħabbi fajl JSON speċifikat mill-utent, iwettaq il-konverżjoni, u jikteb id-dejta fil-fajl 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()

Issejvja din l-iskrittura fil-mogħdija tas-sistema u mexxiha kif meħtieġ:

$ ~/bin/json2yaml.py example.json

3. Parse ħafna u spiss

Xi drabi huwa utli li tħares lejn problema minn angolu differenti. Jekk qed ikollok problemi biex tirrappreżenta r-relazzjonijiet bejn id-dejta tiegħek f'YAML, tista' tittrasformaha temporanjament f'xi ħaġa aktar familjari.

Pereżempju, jekk tkun komdu taħdem ma 'listi ta' dizzjunarju jew JSON, tista 'tikkonverti YAML għal JSON b'żewġ kmandi biss fil-qoxra Python interattiva. Ejja ngħidu li għandek fajl YAML mydata.yaml, allura dan huwa kif jidher:

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

Tista' ssib ħafna eżempji oħra dwar dan is-suġġett. Barra minn hekk, hemm ħafna konvertituri onlajn u parsers lokali disponibbli. Allura toqgħodx lura milli tifformat id-data mill-ġdid meta tara biss jumble inkomprensibbli fiha.

4. Aqra l-ispeċifikazzjonijiet

Ir-ritorn lejn YAML wara waqfa twila, huwa utli li żżur yaml.org u aqra mill-ġdid l-ispeċifikazzjonijiet (specs). Jekk għandek diffikultajiet ma 'YAML, iżda ma wasaltx għall-ispeċifikazzjoni, allura wasal iż-żmien li tikkoreġi din is-sitwazzjoni. L-ispeċifikazzjonijiet huma sorprendentement faċli biex tikteb, u r-rekwiżiti tas-sintassi huma illustrati b'numru kbir ta 'eżempji f' Kapitolu 6.

5. Psewdo-konfigurazzjonijiet

Meta tikteb ktieb jew artiklu, huwa dejjem utli li l-ewwel tfassal abbozz preliminari, għall-inqas fil-forma ta 'sommarju. Huwa l-istess ma 'YAML. Ħafna probabbli, għandek idea ta 'liema data trid tinkiteb f'fajl YAML, iżda ma tantx tifhem kif tikkonnettjaha ma' xulxin. Għalhekk, qabel sculpting YAML, iġbed pseudo-config.

Psewdo-config huwa simili għall-psewdo-kodiċi, fejn m'għandekx għalfejn tinkwieta dwar l-istruttura jew l-indentazzjoni, ir-relazzjonijiet bejn il-ġenituri u t-tfal, il-wirt u l-bejta. Huwa l-istess hawn: tiġbed iterazzjonijiet tad-dejta hekk kif jinqalgħu f'rasek.

10 passi għal YAML Zen

Programmaturi tal-lista psewdo-konfigurazzjoni (Martin u Tabitha) u l-ħiliet tagħhom (lingwi tal-ipprogrammar: Python, Perl, Pascal u Lisp, Fortran, Erlang, rispettivament).

Wara li tpinġi psewdo-konfigurazzjoni fuq biċċa karta, analizzaha bir-reqqa u, jekk kollox huwa fl-ordni, ifformattjah fil-forma ta 'fajl YAML validu.

6. Id-Dilemma Tabs vs Spazji

Int ser ikollok issolvi d-dilemma "tabs jew spazji?". Mhux f'sens globali, iżda biss fil-livell tal-organizzazzjoni tiegħek, jew tal-inqas proġett. Ma jimpurtax jekk dan jinvolvix l-użu ta’ post-ipproċessar b’kitba sed, it-twaqqif ta’ edituri ta’ test fuq il-magni tal-programmaturi, jew it-teħid universalment ta’ rċevuti ta’ konformità stretta mal-istruzzjonijiet tal-linter taħt theddida ta’ tkeċċija, iżda l-membri kollha tat-tim tiegħek li fil- mod jew ieħor jirrelataw ma 'YAML għandhom jużaw biss spazji (kif meħtieġ mill-ispeċifikazzjoni YAML).

Fi kwalunkwe editur ta 'test normali, tista' tikkonfigura tabs awto-korretti għal numru speċifikat ta 'spazji, sabiex ir-ribelljoni ta' aderenti ewlenin Tab m'għandekx għalfejn tibża'.

Kif jaf sew kull hater YAML, ma tistax tara d-differenza bejn tabs u spazji fuq l-iskrin. U meta xi ħaġa ma tkunx viżibbli, normalment tkun l-aħħar ħaġa li n-nies jiftakru, wara li jkunu rranġaw, ċċekkjaw u eliminaw il-problemi l-oħra kollha possibbli. Siegħa ta’ ħin li tqatta’ tfittex għal kurva ta’ tabulazzjoni jew blokka ta’ spazji sempliċiment tgħajjat ​​li għandek bżonn b’mod urġenti biex toħloq politika għall-użu ta’ wieħed jew l-ieħor, u mbagħad timplimenta kontroll tal-konkrit rinfurzat għall-konformità magħha (pereżempju, permezz ganċ Git biex iġġiegħelha minn linter).

7. Inqas huwa aktar (jew aktar huwa inqas)

Xi nies jixtiequ jiktbu f'YAML għax jenfasizza l-istruttura. Fl-istess ħin, jużaw b'mod attiv l-indentazzjoni biex jenfasizzaw blokki ta 'dejta. Din hija tip ta 'scam biex timita lingwi ta' markup li jużaw delimitaturi espliċiti.

Hawnhekk huwa eżempju ta 'tali struttura minn Dokumentazzjoni Ansible:

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

Għal xi wħud, din l-għażla tgħinhom issolvi l-istruttura YAML f'rashom; għal oħrajn, għall-kuntrarju, tirritahom b'ħafna inċiżi bla bżonn, fl-opinjoni tagħhom.

Imma jekk int is-sid tad-dokument YAML u tkun responsabbli għaż-żamma tiegħu, allura int u int biss trid tiddefinixxi kif tuża l-indentazzjoni. Jekk tkun imdejqa minn ikkuttunar kbir, żommha għall-minimu possibbli skont l-ispeċifikazzjoni YAML. Pereżempju, il-fajl ta 'hawn fuq mid-dokumentazzjoni ta' Ansible jista 'jinkiteb mill-ġdid bħal dan mingħajr ebda telf:

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

8. Uża vojt

Jekk kontinwament tirrepeti l-istess żbalji meta timla fajl YAML, jagħmel sens li daħħal mudell fih bħala kumment. Imbagħad id-darba li jmiss tista' sempliċement tikkopja dan il-mudell u ddaħħal dejta reali hemmhekk, pereżempju:

---
# - <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. Uża xi ħaġa differenti

Jekk l-applikazzjoni ma jkollhiex stranglehold fuqek, allura jista 'jkun ta' min ibiddel il-YAML għal format differenti. Maż-żmien, il-fajls tal-konfigurazzjoni jistgħu jegħlbu lilhom infushom u allura huwa aħjar li jaqilbuhom fi skripts sempliċi f'Lua jew Python.

YAML hija ħaġa kbira li ħafna nies iħobbu għall-minimaliżmu u s-sempliċità tagħha, iżda hija 'l bogħod mill-unika għodda fl-armament tiegħek. Allura kultant tista 'tiċħadha. Il-libreriji tal-parsing huma faċli biex jinstabu għal YAML, għalhekk jekk toffri għażliet ta 'migrazzjoni faċli, l-utenti tiegħek se jgħix dan in-nuqqas relattivament mingħajr tbatija.

Jekk ma tistax tgħaddi mingħajr YAML, imbagħad ħu dawn l-10 pariri u tegħleb id-dispjaċir tiegħek għal YAML darba għal dejjem!

Sors: www.habr.com

Żid kumment