10 Cam i YAML Zen

Rydyn ni i gyd yn caru Ansible, ond Ansible yw YAML. Mae yna lawer o fformatau ar gyfer ffeiliau ffurfweddu: rhestrau o werthoedd, paramedr-gwerth paramedr, ffeiliau INI, YAML, JSON, XML, a llawer o rai eraill. Fodd bynnag, am sawl rheswm, o bob un ohonynt, mae YAML yn aml yn cael ei ystyried yn arbennig o anodd. Yn benodol, er gwaethaf ei finimaliaeth adfywiol a'i phosibiliadau trawiadol ar gyfer gweithio gyda gwerthoedd hierarchaidd, gall cystrawen YAML fod yn annifyr gyda'i ddull Python-debyg o fewnoli.

10 Cam i YAML Zen

Os yw YAML yn eich pwyllo, fe allwch chi - a dylech chi! - cymerwch y 10 cam nesaf i leihau eich llid i lefel dderbyniol a charu YAML. Fel sy'n gweddu i'r rhestr hon, bydd ein deg awgrym yn cael eu rhifo o'r dechrau, rydym yn ychwanegu myfyrdod ac arferion ysbrydol fel y dymunir 😉

0. Gwnewch i'ch golygydd weithio

Nid oes ots pa olygydd testun sydd gennych, mae'n debyg bod o leiaf un ategyn YAML ar ei gyfer. Os nad oes gennych un, darganfyddwch a gosodwch ar unwaith. Bydd yr amser a dreuliwch yn chwilio ac yn tweaking yn talu ar ei ganfed lawer gwaith bob tro y bydd angen i chi olygu YAML.

Er enghraifft, golygydd Atom yn cefnogi YAML yn ddiofyn, ond ar gyfer GNU Emacs bydd yn rhaid i chi osod pecynnau ychwanegol, er enghraifft, modd yaml.

10 Cam i YAML Zen

Emacs yn y modd YAML ac yn dangos bylchau.

Os nad oes gan eich hoff olygydd fodd YAML, yna gellir datrys rhai o'r problemau trwy weithio gyda'r gosodiadau. Er enghraifft, nid oes gan y golygydd testun rhagosodedig ar gyfer GNOME, Gedit, fodd YAML, ond yn ddiofyn mae'n amlygu cystrawen YAML ac yn caniatáu i chi addasu mewnoliad:

10 Cam i YAML Zen

Gosod mewnoliadau yn Gedit.

Mae ategyn mannau tynnu ar gyfer Gedit, mae'n dangos bylchau fel dotiau, gan ddileu amwysedd gyda lefelau mewnoliad.

Mewn geiriau eraill, cymerwch yr amser i ddysgu'ch hoff olygydd. Darganfyddwch beth sydd ganddo ef neu ei gymuned ddatblygu i'w gynnig ar gyfer gweithio gyda YAML, a manteisiwch ar y cyfleoedd hynny. Yn bendant ni fyddwch yn difaru.

1. Defnyddiwch leinin

Yn ddelfrydol, mae ieithoedd rhaglennu ac ieithoedd marcio yn defnyddio cystrawen rhagweladwy. Mae cyfrifiaduron yn dda am ragweladwyedd, a dyna pam yn ôl yn 1978 y cododd y cysyniad llanast. Os yw wedi mynd heibio ers 40 mlynedd o'i fodolaeth ac nad ydych yn dal i ddefnyddio'r llong YAML, yna mae'n bryd rhoi cynnig ar yamllint.

I osod yamllint Gallwch ddefnyddio'r rheolwr pecynnau Linux brodorol. Er enghraifft, yn Red Hat Enterprise Linux 8 neu Fedora mae'n cael ei wneud fel hyn:

$ sudo dnf install yamllint

Yna rydych chi'n rhedeg yamllint, gan basio ffeil YAML iddo i'w brofi. Dyma sut mae'n edrych os byddwch chi'n pasio ffeil gyda gwall i'r lint:

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

Nid yr amser yw'r rhifau ar y chwith, ond cyfesurynnau'r gwall: rhif y rhes a'r golofn. Efallai na fydd y disgrifiad o'r gwall yn dweud dim wrthych, ond rydych chi'n gwybod yn union ble mae. Edrychwch ar y lle hwn yn y cod, ac mae'n debyg y bydd popeth yn dod yn glir.

Pan na fydd yamllint yn canfod unrhyw wallau mewn ffeil, nid oes dim yn cael ei argraffu i'r sgrin. Os yw distawrwydd o'r fath yn eich dychryn a'ch bod chi eisiau ychydig mwy o adborth, yna gallwch chi redeg y lint gyda'r gorchymyn amodol adlais trwy ampersand dwbl (&&), fel hyn:

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

Yn POSIX, mae'r ampersand dwbl yn tanio os a dim ond os bydd y gorchymyn blaenorol yn dychwelyd 0. Ac mae yamllint yn dychwelyd nifer y gwallau a ddarganfuwyd, a dyna pam mae'r holl waith adeiladu amodol hwn yn gweithio.

2. Ysgrifennwch yn Python, nid YAML

Os yw YAML wir yn eich pwyllo, peidiwch ag ysgrifennu ynddo, yn llythrennol. Mae'n digwydd mai YAML yw'r unig fformat sy'n cael ei dderbyn gan y cais. Ond yn yr achos hwn, nid oes angen creu ffeil YAML. Ysgrifennwch ar yr hyn yr ydych yn ei hoffi, ac yna trosi. Er enghraifft, mae llyfrgell wych ar gyfer Python pyyaml a dwy ffordd gyfan o drosi: hunan-drosi a throsi trwy sgriptiau.

Hunan-drosi

Yn yr achos hwn, mae'r ffeil ddata hefyd yn sgript Python sy'n cynhyrchu YAML. Mae'r dull hwn orau ar gyfer setiau data bach. Yn syml, rydych chi'n ysgrifennu data JSON i newidyn Python, yn ei ragddodi â chyfarwyddeb fewnforio, ac yn ychwanegu tair llinell ar ddiwedd y ffeil i weithredu'r allbwn.

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

Nawr rydym yn rhedeg y ffeil hon yn Python ac yn cael y ffeil output.yaml fel allbwn:

$ 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

Mae hyn yn berffaith ddilys YAML, ond bydd yamllint yn eich rhybuddio nad yw'n dechrau gyda -. Wel, gellir cywiro hyn yn hawdd â llaw, neu ei addasu ychydig gan y sgript Python.

Trosi trwy sgriptiau

Yn yr achos hwn, rydym yn ysgrifennu yn JSON yn gyntaf, ac yna'n rhedeg y trawsnewidydd fel sgript Python ar wahân, sy'n cynhyrchu YAML fel allbwn. O'i gymharu â'r dull blaenorol, mae'r dull hwn yn graddio'n well, gan fod y trawsnewid yn ddata gwahanu.

Yn gyntaf, gadewch i ni greu ffeil JSON example.json, er enghraifft, gallwch chi ei gymryd o 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"
			}
		  }
		}
	  }
	}

Nesaf, gadewch i ni greu sgript trawsnewidydd syml a'i gadw fel json2yaml.py. Mae'r sgript hon yn mewngludo'r modiwlau YAML a JSON Python, yn llwytho ffeil JSON a bennir gan y defnyddiwr, yn cyflawni'r trosiad, ac yn ysgrifennu'r data i'r ffeil 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()

Cadw'r sgript hon i lwybr y system a rhedeg yn ôl yr angen:

$ ~/bin/json2yaml.py example.json

3. Dosberthwch lawer ac aml

Weithiau mae'n helpu i edrych ar broblem o ongl wahanol. Os ydych chi'n ei chael hi'n anodd cynrychioli perthnasoedd rhwng data yn YAML, gallwch chi eu trawsnewid dros dro yn rhywbeth mwy cyfarwydd.

Er enghraifft, os ydych chi'n gyfforddus yn gweithio gyda rhestrau geiriadur neu JSON, yna gellir trosi YAML i JSON gyda dim ond dau orchymyn mewn cragen Python rhyngweithiol. Gadewch i ni ddweud bod gennych chi ffeil YAML mydata.yaml, yna dyma sut olwg fyddai arno:

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

Mae llawer o enghreifftiau eraill ar y pwnc hwn. Yn ogystal, mae yna lawer o drawsnewidwyr ar-lein a pharsers lleol ar gael. Felly mae croeso i chi ailfformatio'r data pan fyddwch chi'n gweld dim ond mishmash annealladwy ynddo.

4. Darllenwch y manylebau

Gan ddod yn ôl i YAML ar ôl seibiant hir, mae'n ddefnyddiol gwirio iaml.org ac ailddarllen y manylebau (specs). Os ydych chi'n cael anawsterau gyda YAML, ond nad yw'ch dwylo wedi cyrraedd y fanyleb, yna mae'n bryd cywiro'r sefyllfa hon. Mae'r manylebau'n rhyfeddol o hawdd i'w hysgrifennu, ac mae'r gofynion cystrawen wedi'u darlunio â digon o enghreifftiau ynddynt Pennod 6.

5. Pseudoconfigs

Wrth ysgrifennu llyfr neu erthygl, mae bob amser yn syniad da braslunio amlinelliad rhagarweiniol yn gyntaf, o leiaf ar ffurf tabl cynnwys. Yr un peth ag YAML. Yn fwyaf tebygol, mae gennych syniad o ba ddata y dylid ei ysgrifennu i ffeil YAML, ond nid ydych yn deall mewn gwirionedd sut i'w cysylltu â'i gilydd. Felly, cyn cerflunio YAML, lluniwch ffug-ffurfwedd.

Mae pseudoconfig fel ffug-god lle nad oes rhaid i chi boeni am strwythur na mewnoliad, perthnasoedd rhiant-plentyn, etifeddiaeth, a nythu. Felly y mae yma: rydych yn tynnu llun iteriadau o'r data fel y maent yn ymddangos yn eich pen.

10 Cam i YAML Zen

Pseudoconfig rhestru rhaglenwyr (Martin a Tabitha) a'u sgiliau (ieithoedd rhaglennu: Python, Perl, Pascal a Lisp, Fortran, Erlang, yn y drefn honno).

Ar ôl llunio ffug-ffurfwedd ar ddarn o bapur, dadansoddwch ef yn ofalus ac, os yw popeth mewn trefn, fformatiwch ef fel ffeil YAML dilys.

6. Dilema'r Tabiau neu'r Gofodau

Mae'n rhaid i chi ddatrys cyfyng-gyngor "tabiau neu fylchau?". Nid mewn ystyr byd-eang, ond dim ond ar lefel eich sefydliad, neu o leiaf prosiect. Nid oes ots os yw hyn yn cynnwys ôl-brosesu gyda sgript sed, gosod golygyddion testun ar beiriannau rhaglenwyr, neu gymryd derbynebau'n llwyr am gadw'n gaeth at gyfarwyddiadau'r llong dan fygythiad o gael eu tanio, ond mae pob aelod o'ch tîm sydd mewn rhaid i un ffordd neu'r llall ymwneud ag YAML ddefnyddio bylchau yn unig (fel sy'n ofynnol gan fanyleb YAML).

Mewn unrhyw olygydd testun arferol, gallwch sefydlu auto-disodli tabiau ar gyfer nifer penodol o fylchau, felly mae'r gwrthryfel ymlynwyr yr allwedd Tab ni allwch ofni.

Fel y mae pob caswr YAML yn ymwybodol iawn, nid oes gwahaniaeth rhwng tabiau a bylchau ar y sgrin. A phan nad yw rhywbeth yn weladwy, mae'n cael ei gofio, fel rheol, yn olaf, ar ôl iddo gael ei ddatrys, ei wirio a dileu pob problem bosibl arall. Mae awr o amser yn cael ei wastraffu yn chwilio am dab neu floc o leoedd yn dweud bod angen i chi greu polisi ar frys ar gyfer defnyddio un neu'r llall, ac yna gweithredu gwiriad concrit wedi'i atgyfnerthu i weld a yw'n cydymffurfio (er enghraifft, trwy fachyn Git i gorfodi rhediad trwy'r lint).

7. Mae llai yn well (neu mae mwy yn llai)

Mae rhai pobl yn hoffi ysgrifennu yn YAML oherwydd ei fod yn pwysleisio strwythur. Ar yr un pryd, maent yn defnyddio mewnoliadau i amlygu blociau o ddata. Mae'n fath o sgam i ddynwared ieithoedd marcio sy'n defnyddio amffinyddion penodol.

Dyma enghraifft o strwythur o'r fath gan Dogfennaeth addas:

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

I rai, mae'r opsiwn hwn yn helpu i ddadelfennu strwythur YAML yn eu pennau, tra i eraill, i'r gwrthwyneb, mae'n eu cythruddo gyda màs o fewnoliadau diangen, yn eu barn nhw.

Ond os mai chi yw perchennog y ddogfen YAML ac yn gyfrifol am ei chynnal, yna chi a dim ond chi Dylai benderfynu sut i ddefnyddio mewnoliad. Os bydd mewnoliad mawr yn eich cythruddo, cadwch ef i'r lleiaf posibl yn unol â manyleb YAML. Er enghraifft, gellir ailysgrifennu'r ffeil uchod o'r ddogfennaeth Ansible fel hyn heb unrhyw golled:

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

8. Defnyddiwch fylchau

Os ydych chi'n ailadrodd yr un camgymeriadau wrth lenwi ffeil YAML, mae'n gwneud synnwyr mewnosod templed gwag ynddo fel sylw. Yna y tro nesaf gallwch chi gopïo hwn yn wag a nodi data go iawn yno, er enghraifft:

---
# - <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. Defnyddiwch Rywbeth Gwahanol

Os nad oes gan y cais rwystr arnoch chi, yna efallai y byddai'n werth newid YAML i fformat arall. Dros amser, gall ffeiliau cyfluniad dyfu'n rhy fawr, ac yna mae'n well eu trosi'n sgriptiau Lua neu Python syml.

Mae YAML yn beth gwych y mae llawer o bobl yn ei garu oherwydd ei finimaliaeth a'i symlrwydd, ond mae'n bell o fod yr unig offeryn yn eich arsenal. Felly weithiau gallwch chi ei wrthod. Mae'n hawdd dod o hyd i lyfrgelloedd dosrannu ar gyfer YAML, felly os ydych chi'n cynnig opsiynau mudo cyfleus, bydd eich defnyddwyr yn goroesi gwrthodiad o'r fath yn gymharol ddi-boen.

Os na allwch wneud heb YAML, yna cymerwch y 10 awgrym hyn ar waith a threchwch eich atgasedd tuag at YAML unwaith ac am byth!

Ffynhonnell: hab.com

Ychwanegu sylw