10 stappe na YAML Zen

Ons is almal lief vir Ansible, maar Ansible is YAML. Daar is baie formate vir konfigurasielêers: waardelyste, parameter-waarde-pare, INI-lêers, YAML, JSON, XML, en vele ander. Om verskeie redes, van almal, word YAML egter dikwels as besonder moeilik beskou. In die besonder, ten spyte van sy verfrissende minimalisme en indrukwekkende moontlikhede om met hiërargiese waardes te werk, kan die YAML-sintaksis irriterend wees met sy Python-agtige benadering tot inkeping.

10 stappe na YAML Zen

As YAML jou vies maak, kan jy - en jy moet! - neem die volgende 10 stappe om jou irritasie tot 'n aanvaarbare vlak te verminder en lief te wees vir YAML. Soos dit hierdie lys betaam, sal ons tien wenke van voor af genommer word, ons voeg meditasie en geestelike praktyke by soos verlang 😉

0. Laat jou redakteur werk

Dit maak nie saak watter teksredigeerder jy het nie, daar is waarskynlik ten minste een YAML-inprop daarvoor. As jy nie een het nie, vind en installeer dadelik. Die tyd wat jy spandeer om te soek en aan te pas, sal baie keer meer betaal elke keer as jy YAML moet wysig.

Byvoorbeeld, redakteur Atom ondersteun YAML by verstek, maar vir GNU Emacs sal jy bykomende pakkette moet installeer, byvoorbeeld, yaml-modus.

10 stappe na YAML Zen

Emacs in YAML-modus en vertoon spasies.

As jou gunsteling redakteur nie YAML-modus het nie, kan sommige van die probleme opgelos word deur met die instellings te werk. Byvoorbeeld, die verstek teksredigeerder vir GNOME, Gedit, het nie YAML-modus nie, maar dit beklemtoon standaard YAML-sintaksis en laat jou toe om inkeping aan te pas:

10 stappe na YAML Zen

Stel inkepings in Gedit.

'n Inprop trekplekke vir Gedit vertoon dit spasies as kolletjies, wat onduidelikhede met inkepingsvlakke uitskakel.

Met ander woorde, neem die tyd om jou gunsteling redakteur te leer. Vind uit wat hy of sy ontwikkelingsgemeenskap kan bied om met YAML te werk, en benut daardie geleenthede. Jy sal beslis nie spyt wees nie.

1. Gebruik 'n linter

Ideaal gesproke gebruik programmeertale en opmaaktale voorspelbare sintaksis. Rekenaars is goed met voorspelbaarheid, en daarom het die konsep in 1978 ontstaan linter. As dit in 40 jaar van sy bestaan ​​by jou verbygegaan het en jy steeds nie die YAML linter gebruik nie, dan is dit tyd om yamllint te probeer.

Om te installeer yamllint U kan die inheemse Linux-pakketbestuurder gebruik. Byvoorbeeld, in Red Hat Enterprise Linux 8 of Fedora dit word so gedoen:

$ sudo dnf install yamllint

Jy hardloop dan eenvoudig yamllint en gee dit 'n YAML-lêer aan om te toets. Hier is hoe dit lyk as jy 'n lêer met 'n fout na die linter deurgee:

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

Die getalle aan die linkerkant is nie die tyd nie, maar die koördinate van die fout: die nommer van die ry en kolom. Die beskrywing van die fout sê dalk niks vir jou nie, maar jy weet presies waar dit is. Kyk net na hierdie plek in die kode, en heel waarskynlik sal alles duidelik word.

Wanneer yamllint geen foute in 'n lêer vind nie, word niks op die skerm gedruk nie. As so 'n stilte jou bang maak en jy wil 'n bietjie meer terugvoer hê, dan kan jy die linter met die eggo voorwaardelike opdrag deur 'n dubbele ampersand (&&) soos volg laat loop:

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

In POSIX word die dubbele ampersand afgevuur as en slegs as die voorafgaande opdrag 0 gee. En yamllint gee net die aantal foute wat gevind is terug, en daarom werk hierdie hele voorwaardelike konstruk.

2. Skryf in Python, nie YAML nie

As YAML jou regtig vies maak, moet net nie letterlik daarin skryf nie. Dit gebeur dat YAML die enigste formaat is wat deur die aansoek aanvaar word. Maar in hierdie geval is dit nie nodig om 'n YAML-lêer te skep nie. Skryf oor waarvan jy hou, en skakel dan om. Daar is byvoorbeeld 'n wonderlike biblioteek vir Python pyyaml en twee hele maniere van omskakeling: self-omskakeling en omskakeling deur middel van skrifte.

Self-bekeerend

In hierdie geval is die datalêer ook 'n Python-skrip wat YAML genereer. Hierdie metode is die beste vir klein datastelle. Jy skryf eenvoudig JSON-data na 'n Python-veranderlike, voorvoegsel dit met 'n invoer-aanwysing, en voeg drie reëls aan die einde van die lêer by om die uitvoer te implementeer.

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

Nou hardloop ons hierdie lêer in Python en kry die output.yaml lêer as 'n uitvoer:

$ 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

Dit is heeltemal geldig YAML, maar yamllint sal jou waarsku dat dit nie met - begin nie. Wel, dit kan maklik met die hand reggestel word, of effens aangepas word deur die Python-skrif.

Omskakeling via skrifte

In hierdie geval skryf ons eers in JSON, en hardloop dan die omskakelaar as 'n aparte Python-skrip, wat YAML as 'n uitvoer produseer. In vergelyking met die vorige metode, skaal hierdie metode beter, aangesien die omskakeling geskeide data is.

Kom ons skep eers 'n JSON-lêer example.json, jy kan dit byvoorbeeld neem 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"
			}
		  }
		}
	  }
	}

Kom ons skep dan 'n eenvoudige omskakelingskrip en stoor dit as json2yaml.py. Hierdie skrif voer beide die YAML- en JSON Python-modules in, laai die gebruiker-gespesifiseerde JSON-lêer, voer die omskakeling uit en skryf die data na die output.yaml-lêer.

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

Stoor hierdie skrip na die stelselpad en hardloop soos nodig:

$ ~/bin/json2yaml.py example.json

3. Ontleed baie en dikwels

Soms help dit om uit 'n ander hoek na 'n probleem te kyk. As jy dit moeilik vind om verwantskappe tussen data in YAML voor te stel, kan jy dit tydelik omskep in iets meer bekend.

Byvoorbeeld, as jy gemaklik is om met woordeboeklyste of JSON te werk, kan YAML omgeskakel word na JSON met net twee opdragte in 'n interaktiewe Python-dop. Kom ons sê jy het 'n YAML-lêer mydata.yaml, dan is dit hoe dit sal lyk:

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

Daar is baie ander voorbeelde oor hierdie onderwerp. Daarbenewens is daar baie aanlyn-omskakelaars en plaaslike ontleders beskikbaar. So voel vry om die data te herformateer wanneer jy net 'n onverstaanbare mengelmoes daarin sien.

4. Lees die spesifikasies

Om terug te kom na YAML na 'n lang onderbreking, is dit nuttig om uit te check yaml.org en lees weer die spesifikasies (spesifikasies). As u probleme ondervind met YAML, maar u hande het nie die spesifikasie bereik nie, dan is dit tyd om hierdie situasie reg te stel. Die spesifikasies is verbasend maklik om te skryf, en die sintaksisvereistes word geïllustreer met baie voorbeelde in Hoofstuk 6.

5. Pseudokonfigurasies

Wanneer 'n boek of artikel geskryf word, is dit altyd 'n goeie idee om eers 'n voorlopige uiteensetting te skets, ten minste in die vorm van 'n inhoudsopgawe. Dieselfde met YAML. Waarskynlik, jy het 'n idee van watter data na die YAML-lêer geskryf moet word, maar jy verstaan ​​nie regtig hoe om dit met mekaar in verband te bring nie. Daarom, voordat jy YAML beeldhou, teken 'n pseudo-opstelling.

Pseudoconfig is soos pseudokode waar jy jou nie hoef te bekommer oor struktuur of inkeping, ouer-kind verhoudings, erfenis en nes nie. So dit is hier: jy teken iterasies van die data soos dit in jou kop verskyn.

10 stappe na YAML Zen

Pseudoconfig lys programmeerders (Martin en Tabitha) en hul vaardighede (programmeertale: Python, Perl, Pascal en Lisp, Fortran, Erlang, onderskeidelik).

Nadat u 'n pseudo-opstelling op 'n stuk papier geteken het, ontleed dit noukeurig en, as alles in orde is, formateer dit as 'n geldige YAML-lêer.

6. Die Tabs of Spaces-dilemma

Jy moet 'n dilemma oplos "tabs of spasies?". Nie in 'n globale sin nie, maar slegs op die vlak van jou organisasie, of ten minste 'n projek. Dit maak nie saak of dit naverwerking met 'n sed-skrip behels, die opstel van teksredigeerders op programmeerders se masjiene, of die volledige neem van kwitansies vir streng nakoming van die linter se instruksies wat dreig om afgedank te word nie, maar alle lede van jou span wat in een of ander manier verband hou met YAML moet slegs spasies gebruik (soos vereis deur die YAML spesifikasie).

In enige gewone teksredigeerder kan u outomatiese vervanging van oortjies vir 'n gegewe aantal spasies opstel, sodat die aanhangers van die sleutel in opstand kom. Blad jy kan nie bang wees nie.

Soos elke YAML-hater deeglik bewus is, is daar geen verskil tussen oortjies en spasies op die skerm nie. En wanneer iets nie sigbaar is nie, word dit as 'n reël laaste onthou, nadat dit uitgesorteer, nagegaan en alle ander moontlike probleme uitgeskakel is. 'n Uur se tyd wat vermors word op soek na 'n oortjie of blok spasies, skree net dat jy dringend 'n beleid moet skep vir die gebruik van die een of die ander, en dan 'n gewapende beton-tjek vir die nakoming daarvan moet implementeer (byvoorbeeld deur 'n Git-haak om dwing om deur die linter te hardloop).

7. Minder is beter (of meer is minder)

Sommige mense hou daarvan om in YAML te skryf omdat dit struktuur beklemtoon. Terselfdertyd gebruik hulle aktief inkepings om blokke data uit te lig. Dit is soort van 'n bedrogspul om opmaaktale na te boots wat eksplisiete afbakenings gebruik.

Hier is 'n voorbeeld van so 'n struktuur van Behoorlike dokumentasie:

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

Vir sommige help hierdie opsie om die YAML-struktuur in hul koppe te ontbind, terwyl dit vir ander, inteendeel, hulle irriteer met 'n massa onnodige, na hul mening, inkepings.

Maar as jy die eienaar van die YAML-dokument is en verantwoordelik is vir die instandhouding daarvan, dan jy en net jy moet bepaal hoe om inkeping te gebruik. As groot inkepings jou irriteer, hou dit tot die minimum moontlik volgens die YAML-spesifikasie. Byvoorbeeld, die bogenoemde lêer uit die Ansible-dokumentasie kan so herskryf word sonder enige verlies:

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

8. Gebruik spasies

As jy aanhou om dieselfde foute te herhaal wanneer jy 'n YAML-lêer invul, maak dit sin om 'n leë sjabloon daarin in te voeg as 'n opmerking. Dan kan jy die volgende keer eenvoudig hierdie spasie kopieer en werklike data daar invoer, byvoorbeeld:

---
# - <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. Gebruik iets anders

As die toepassing nie 'n wurggreep op jou het nie, is dit dalk die moeite werd om YAML na 'n ander formaat te verander. Met verloop van tyd kan konfigurasielêers hulself ontgroei, en dan is dit beter om dit in eenvoudige Lua- of Python-skrifte om te skakel.

YAML is 'n wonderlike ding wat baie mense liefhet vir sy minimalisme en eenvoud, maar dit is ver van die enigste hulpmiddel in jou arsenaal. So soms kan jy dit weier. Dit is maklik om ontledingsbiblioteke vir YAML te vind, so as jy gerieflike migrasie-opsies bied, sal jou gebruikers so 'n verwerping relatief pynloos oorleef.

As jy nie sonder YAML kan klaarkom nie, neem dan hierdie 10 wenke in diens en verslaan jou afkeer vir YAML eens en vir altyd!

Bron: will.com

Voeg 'n opmerking