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.
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
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:
L-issettjar ta' inċiżi f'Gedit.
Plugin
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 '
Installa
$ 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
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
{
"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
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.
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
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
# 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