10 trin til YAML Zen

Vi elsker alle Ansible, men Ansible er YAML. Der er mange formater til konfigurationsfiler: lister over værdier, parameter-værdi-par, INI-filer, YAML, JSON, XML og mange andre. Men af ​​flere grunde, af dem alle, anses YAML ofte for at være særligt vanskeligt. Især på trods af dens forfriskende minimalisme og imponerende muligheder for at arbejde med hierarkiske værdier, kan YAML-syntaksen være irriterende med dens Python-lignende tilgang til indrykning.

10 trin til YAML Zen

Hvis YAML pisser dig af, kan du - og det skal du! - tag de næste 10 trin for at reducere din irritation til et acceptabelt niveau og elske YAML. Som det sømmer sig på denne liste, vil vores ti tips blive nummereret fra bunden, vi tilføjer meditation og spirituelle øvelser som ønsket 😉

0. Få din redaktør til at arbejde

Det er lige meget hvilken teksteditor du har, der er sandsynligvis mindst et YAML-plugin til det. Hvis du ikke har en, så find og installer med det samme. Den tid, du bruger på at søge og finjustere, vil betale sig mange gange, hver gang du skal redigere YAML.

For eksempel redaktør Atom understøtter YAML som standard, men for GNU Emacs skal du installere yderligere pakker, f.eks. yaml-tilstand.

10 trin til YAML Zen

Emacs i YAML-tilstand og viser mellemrum.

Hvis din yndlingseditor ikke har YAML-tilstand, så kan nogle af problemerne løses ved at arbejde med indstillingerne. For eksempel har standardteksteditoren for GNOME, Gedit, ikke YAML-tilstand, men som standard fremhæver den YAML-syntaks og giver dig mulighed for at tilpasse indrykning:

10 trin til YAML Zen

Indstilling af indrykning i Gedit.

Et plugin trækpladser for Gedit viser det mellemrum som prikker, hvilket eliminerer tvetydigheder med indrykningsniveauer.

Med andre ord, tag dig tid til at lære din foretrukne editor. Find ud af, hvad han eller hans udviklingsfællesskab har at tilbyde for at arbejde med YAML, og udnyt disse muligheder. Du vil bestemt ikke fortryde det.

1. Brug en linter

Ideelt set bruger programmeringssprog og markup-sprog forudsigelig syntaks. Computere er gode til forudsigelighed, og derfor opstod konceptet tilbage i 1978 linter. Hvis den i løbet af 40 år af sin eksistens er gået forbi dig, og du stadig ikke bruger YAML linter, så er det tid til at prøve yamllint.

etablere yamllint Du kan bruge den oprindelige Linux-pakkehåndtering. For eksempel i Red Hat Enterprise Linux 8 eller Fedora det gøres sådan her:

$ sudo dnf install yamllint

Du kører derefter blot yamllint og sender en YAML-fil til den for at teste. Sådan ser det ud, hvis du sender en fil med en fejl til linteren:

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

Tallene til venstre er ikke tiden, men koordinaterne for fejlen: rækkens og kolonnens nummer. Beskrivelsen af ​​fejlen fortæller dig måske ikke noget, men du ved præcis, hvor den er. Bare se på dette sted i koden, og sandsynligvis vil alt blive klart.

Når yamllint ikke finder fejl i en fil, udskrives intet på skærmen. Hvis en sådan stilhed skræmmer dig, og du vil have lidt mere feedback, så kan du køre linteren med den betingede ekko-kommando gennem et dobbelt og-tegn (&&), sådan her:

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

I POSIX udløses det dobbelte og-tegn, hvis og kun hvis den foregående kommando returnerer 0. Og yamllint returnerer bare antallet af fundne fejl, hvorfor hele denne betingede konstruktion virker.

2. Skriv i Python, ikke YAML

Hvis YAML virkelig gør dig sur, skal du bare ikke skrive i det, bogstaveligt talt. Det sker, at YAML er det eneste format, der accepteres af ansøgningen. Men i dette tilfælde er det ikke nødvendigt at oprette en YAML-fil. Skriv på, hvad du kan lide, og konverter derefter. For eksempel er der et fantastisk bibliotek til Python pyyaml og to hele måder at konvertere på: selvkonvertering og konvertering gennem scripts.

Selvkonverterende

I dette tilfælde er datafilen også et Python-script, der genererer YAML. Denne metode er bedst til små datasæt. Du skriver simpelthen JSON-data til en Python-variabel, præfikser den med et importdirektiv og tilføjer tre linjer i slutningen af ​​filen for at implementere outputtet.

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

Nu kører vi denne fil i Python og får filen output.yaml som output:

$ 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

Dette er helt gyldigt YAML, men yamllint vil advare dig om, at det ikke starter med -. Nå, dette kan nemt rettes i hånden eller justeres lidt af Python-scriptet.

Konvertering via scripts

I dette tilfælde skriver vi først i JSON og kører derefter konverteren som et separat Python-script, som producerer YAML som output. Sammenlignet med den tidligere metode skalerer denne metode bedre, da konverteringen er adskilte data.

Lad os først oprette en JSON-fil eksempel.json, for eksempel, du kan tage den fra 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"
			}
		  }
		}
	  }
	}

Lad os derefter oprette et simpelt konverterscript og gemme det som json2yaml.py. Dette script importerer både YAML- og JSON Python-modulerne, indlæser den brugerspecificerede JSON-fil, udfører konverteringen og skriver dataene til filen 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()

Gem dette script til systemstien og kør efter behov:

$ ~/bin/json2yaml.py example.json

3. Parse meget og ofte

Nogle gange hjælper det at se på et problem fra en anden vinkel. Hvis du har svært ved at repræsentere relationer mellem data i YAML, kan du midlertidigt transformere dem til noget mere velkendt.

For eksempel, hvis du er tryg ved at arbejde med ordbogslister eller JSON, så kan YAML konverteres til JSON med kun to kommandoer i en interaktiv Python-skal. Lad os sige, at du har en YAML-fil mydata.yaml, så er det sådan, det vil se ud:

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

Der er mange andre eksempler på dette emne. Derudover er der mange online-konvertere og lokale parsere tilgængelige. Så du er velkommen til at omformatere dataene, når du kun ser et uforståeligt mishmash i det.

4. Læs specifikationerne

Kommer tilbage til YAML efter en lang pause, er det nyttigt at tjekke ud yaml.org og genlæs specifikationerne (specifikationerne). Hvis du har problemer med YAML, men dine hænder ikke har nået specifikationen, så er det tid til at rette op på denne situation. Specifikationerne er overraskende nemme at skrive, og syntakskravene er illustreret med masser af eksempler i Kapitel 6.

5. Pseudoconfigs

Når du skriver en bog eller artikel, er det altid en god idé først at skitsere en foreløbig disposition, i det mindste i form af en indholdsfortegnelse. Det samme med YAML. Mest sandsynligt har du en idé om, hvilke data der skal skrives til YAML-filen, men forstår ikke rigtig, hvordan du relaterer dem til hinanden. Derfor, før du skulpturerer YAML, skal du tegne en pseudokonfig.

Pseudoconfig er ligesom pseudokode, hvor du ikke behøver at bekymre dig om struktur eller indrykning, forældre-barn-relationer, arv og nesting. Så det er her: du tegner iterationer af dataene, som de vises i dit hoved.

10 trin til YAML Zen

Pseudoconfig viser programmører (Martin og Tabitha) og deres færdigheder (programmeringssprog: henholdsvis Python, Perl, Pascal og Lisp, Fortran, Erlang).

Efter at have tegnet en pseudo-konfiguration på et stykke papir, analyser den omhyggeligt, og hvis alt er i orden, formater den som en gyldig YAML-fil.

6. Tabs eller Spaces-dilemmaet

Du skal løse et dilemma "tabulatorer eller mellemrum?". Ikke i global forstand, men kun på niveau med din organisation, eller i det mindste et projekt. Det er lige meget, om dette involverer efterbehandling med et sed-script, opsætning af teksteditorer på programmørers maskiner eller fuldstændigt at tage kvitteringer for streng overholdelse af linters instruktioner under trussel om at blive fyret, men alle medlemmer af dit team, der i på en eller anden måde relaterer til YAML må kun bruge mellemrum (som krævet af YAML-specifikationen).

I enhver normal teksteditor kan du konfigurere automatisk udskiftning af tabulatorer for et givet antal mellemrum, så nøglens tilhængere gør oprør Tab du kan ikke være bange.

Som enhver YAML-hader godt ved, er der ingen forskel mellem faner og mellemrum på skærmen. Og når noget ikke er synligt, huskes det som udgangspunkt sidst, efter at det er ordnet, tjekket og elimineret alle andre mulige problemer. En times spildtid på at lede efter en fane eller blok af mellemrum råber bare ud, at du er nødt til at lave en politik for at bruge det ene eller det andet, og derefter implementere en jernbetonkontrol for dens overholdelse (f.eks. gennem en Git-hook for at tvinge et løb gennem linteren).

7. Mindre er bedre (eller mere er mindre)

Nogle mennesker kan lide at skrive i YAML, fordi det understreger struktur. Samtidig bruger de aktivt indrykning til at fremhæve datablokke. Det er en slags fidus at efterligne markup-sprog, der bruger eksplicitte afgrænsere.

Her er et eksempel på en sådan struktur fra Ansible dokumentation:

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

For nogle hjælper denne mulighed med at nedbryde YAML-strukturen i deres hoveder, mens den for andre tværtimod irriterer dem med en masse unødvendige, efter deres mening, fordybninger.

Men hvis du er ejer af YAML-dokumentet og er ansvarlig for at vedligeholde det, så dig og kun dig skal bestemme, hvordan man bruger indrykning. Hvis store fordybninger irriterer dig, skal du holde det på det mindst mulige i henhold til YAML-specifikationen. For eksempel kan ovenstående fil fra Ansible-dokumentationen omskrives sådan her uden tab:

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

8. Brug blanks

Hvis du bliver ved med at gentage de samme fejl, når du udfylder en YAML-fil, giver det mening at indsætte en tom skabelon i den som en kommentar. Så næste gang kan du blot kopiere dette tomme felt og indtaste rigtige data der, for eksempel:

---
# - <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. Brug noget andet

Hvis applikationen ikke har kvælertag på dig, så kan det være værd at ændre YAML til et andet format. Over tid kan konfigurationsfiler vokse ud af sig selv, og så er det bedre at konvertere dem til simple Lua- eller Python-scripts.

YAML er en fantastisk ting, som mange mennesker elsker for sin minimalisme og enkelhed, men det er langt fra det eneste værktøj i dit arsenal. Så nogle gange kan du afvise det. Det er nemt at finde parsing-biblioteker til YAML, så hvis du tilbyder praktiske migreringsmuligheder, vil dine brugere overleve en sådan afvisning relativt smertefrit.

Hvis du ikke kan undvære YAML, så tag disse 10 tips i brug og besejr din modvilje mod YAML én gang for alle!

Kilde: www.habr.com

Tilføj en kommentar