10 kauj ruam rau YAML Zen

Peb txhua tus nyiam Ansible, tab sis Ansible yog YAML. Muaj ntau ntau hom ntawv rau configuration ntaub ntawv: cov npe ntawm qhov tseem ceeb, parameter-value khub, INI cov ntaub ntawv, YAML, JSON, XML thiab ntau lwm tus. Txawm li cas los xij, rau ntau qhov laj thawj ntawm txhua tus ntawm lawv, YAML feem ntau suav hais tias nyuaj tshwj xeeb. Tshwj xeeb, txawm hais tias nws cov minimalism tshiab thiab muaj peev xwm ua tau zoo rau kev ua haujlwm nrog cov txiaj ntsig hierarchical, YAML syntax tuaj yeem cuam tshuam nrog nws txoj hauv kev zoo li Python rau indentation.

10 kauj ruam rau YAML Zen

Yog tias YAML pisses koj tawm, koj tuaj yeem - thiab koj yuav tsum! - Ua raws li 10 kauj ruam hauv qab no los txo koj txoj kev ntxhov siab mus rau qib uas tau txais thiab poob rau hauv kev hlub nrog YAML. Raws li cov npe no, peb kaum lub tswv yim yuav raug suav los ntawm kos, peb yuav ntxiv kev xav thiab kev coj ua ntawm sab ntsuj plig ntawm yuav πŸ˜‰

0. Ua kom koj tus editor ua haujlwm

Nws tsis muaj teeb meem dab tsi cov ntawv nyeem koj muaj, tej zaum muaj tsawg kawg yog ib lub plugin rau kev ua haujlwm nrog YAML. Yog tias koj tsis muaj, nrhiav thiab nruab tam sim ntawd. Lub sij hawm siv tshawb nrhiav thiab teeb tsa yuav them ntau zaus txhua zaus koj yuav tsum hloov kho YAML.

Piv txwv li, editor Atom txhawb YAML los ntawm lub neej ntawd, tab sis rau GNU Emacs koj yuav tsum tau nruab cov pob ntxiv, piv txwv li, yaml-mode.

10 kauj ruam rau YAML Zen

Emacs hauv YAML hom thiab tso saib qhov chaw.

Yog tias koj nyiam editor tsis muaj YAML hom, ces qee qhov teeb meem tuaj yeem daws tau los ntawm kev ua haujlwm nrog cov chaw. Piv txwv li, tus qauv GNOME cov ntawv nyeem Gedit tsis muaj YAML hom, tab sis los ntawm lub neej ntawd nws tseem ceeb rau YAML syntax thiab tso cai rau koj los teeb tsa ua haujlwm nrog indentations:

10 kauj ruam rau YAML Zen

Teem indents hauv Gedit.

Ib plugin drawspaces rau Gedit, qhia qhov chaw ua cov dots, tshem tawm qhov tsis meej pem nrog cov qib indentation.

Nyob rau hauv lwm yam lus, siv sij hawm kawm txog koj nyiam editor. Tshawb nrhiav seb nws lossis nws lub zej zog kev loj hlob tau muab rau kev ua haujlwm nrog YAML, thiab siv cov yam ntxwv ntawd. Koj yeej yuav tsis khuv xim nws.

1. Siv lub linter

Qhov zoo tshaj plaws, cov lus programming thiab markup languages ​​siv cov syntax uas tuaj yeem ua tau. Khoos phis tawj yog qhov zoo ntawm kev kwv yees, uas yog vim li cas lub tswv yim ntawm lintera. Yog tias nyob rau hauv 40 xyoo ntawm nws lub neej nws tau dhau koj los ntawm thiab koj tseem tsis tau siv YAML linter, ces nws yog lub sij hawm sim yamllint.

Nruab yamllint Koj tuaj yeem siv tus txheej txheem Linux pob tus thawj tswj hwm. Piv txwv li, hauv Red Hat Enterprise Enterprise 8 lossis Fedora nws ua li no:

$ sudo dnf install yamllint

Ces koj tsuas khiav yamllint, hla nws YAML cov ntaub ntawv los xyuas. Nov yog qhov nws zoo li yog tias koj hla cov ntaub ntawv nrog qhov yuam kev mus rau linter:

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

Cov lej ntawm sab laug tsis yog lub sijhawm, tab sis qhov kev ua haujlwm ntawm qhov yuam kev: kab thiab kab zauv. Cov lus piav qhia ntawm qhov yuam kev yuav tsis qhia koj dab tsi, tab sis koj paub tseeb tias nws nyob qhov twg. Tsuas yog saib ntawm qhov chaw no hauv cov cai, thiab feem ntau yuav luag txhua yam yuav pom meej.

Thaum yamllint pom tsis muaj qhov yuam kev hauv cov ntaub ntawv, tsis muaj dab tsi luam tawm rau qhov screen. Yog tias qhov kev ntsiag to ua rau koj ntshai thiab koj xav tau kev tawm tswv yim me ntsis ntxiv, ces koj tuaj yeem khiav lub linter nrog cov lus txib nyob rau ntawm ob lub ampersand (&&), zoo li qhov no:

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

Hauv POSIX, ob chav ampersand hluav taws kub yog tias thiab tsuas yog cov lus txib ua ntej rov qab 0. Thiab yamllint tsuas yog rov qab cov lej ntawm qhov tsis raug pom, uas yog vim li cas qhov kev tsim kho tag nrho ua haujlwm.

2. Sau hauv Python, tsis yog YAML

Yog YAML tiag tiag pisses koj tawm, tsuas yog tsis txhob sau rau hauv nws, lus. Nws tshwm sim tias YAML yog tib hom ntawv uas daim ntawv thov nkag siab. Tab sis txawm nyob rau hauv cov ntaub ntawv no, nws tsis yog tsim nyog los tsim ib tug YAML ntaub ntawv. Sau rau yam koj nyiam thiab ces hloov dua siab tshiab. Piv txwv li, muaj ib lub tsev qiv ntawv zoo rau Python pyyaml thiab ob txoj kev hloov dua siab tshiab: tus kheej hloov dua siab tshiab thiab hloov dua siab tshiab los ntawm cov ntawv sau.

Kev hloov pauv tus kheej

Hauv qhov no, cov ntaub ntawv cov ntaub ntawv kuj yog Python tsab ntawv uas tsim YAML. Txoj kev no yog qhov zoo tshaj plaws rau cov ntaub ntawv me me. Koj tsuas yog sau cov ntaub ntawv JSON rau hauv Python sib txawv, ua ntej nws nrog cov lus qhia ntshuam, thiab thaum kawg ntawm cov ntaub ntawv ntxiv peb kab los siv cov zis.

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

Tam sim no peb khiav cov ntaub ntawv no hauv Python thiab tau txais cov ntaub ntawv 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

Qhov no zoo kawg nkaus siv tau YAML, tab sis yamllint yuav ceeb toom koj tias nws tsis pib nrog -. Zoo, qhov no tuaj yeem kho tau yooj yim manually lossis hloov kho me ntsis hauv Python tsab ntawv.

Hloov los ntawm scripts

Hauv qhov no, peb thawj zaug sau hauv JSON, thiab tom qab ntawd khiav lub converter raws li cov ntawv Python cais, uas tsim YAML ua cov zis. Piv nrog rau txoj kev dhau los, txoj kev no ntsuas tau zoo dua, txij li kev hloov dua siab tshiab yog cais los ntawm cov ntaub ntawv.

Ua ntej, cia peb tsim cov ntaub ntawv JSON example.json, piv txwv li, koj tuaj yeem coj nws los ntawm 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"
			}
		  }
		}
	  }
	}

Ces peb yuav tsim ib tug yooj yim converter tsab ntawv thiab txuag nws nyob rau hauv lub npe json2yaml.py. Tsab ntawv no imports YAML thiab JSON Python modules, thiab thauj cov neeg siv cov ntaub ntawv JSON, ua qhov hloov dua siab tshiab, thiab sau cov ntaub ntawv mus rau cov ntaub ntawv 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()

Txuag tsab ntawv no rau hauv txoj hauv kev thiab khiav nws raws li xav tau:

$ ~/bin/json2yaml.py example.json

3. Hais ntau thiab ntau zaus

Qee lub sij hawm nws tseem ceeb heev kom saib qhov teeb meem los ntawm lwm lub kaum sab xis. Yog tias koj muaj teeb meem sawv cev rau kev sib raug zoo ntawm koj cov ntaub ntawv hauv YAML, koj tuaj yeem hloov nws mus rau ib yam dab tsi paub dua.

Piv txwv li, yog tias koj nyiam ua haujlwm nrog cov ntawv teev npe lossis JSON, koj tuaj yeem hloov YAML rau JSON nrog tsuas yog ob lo lus txib hauv kev sib tham sib Python plhaub. Cia peb hais tias koj muaj YAML cov ntaub ntawv mydata.yaml, ces qhov no yog qhov nws yuav zoo li:

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

Koj tuaj yeem pom ntau lwm yam piv txwv ntawm lub ncauj lus no. Tsis tas li ntawd, muaj ntau lub converters online thiab cov parsers hauv zos muaj. Yog li tsis txhob yig tau hloov kho cov ntaub ntawv thaum koj pom tsuas yog ib qho kev nkag siab tsis txaus ntseeg hauv nws.

4. Nyeem cov specs

Rov qab mus rau YAML tom qab so ntev, nws tseem ceeb heev rau kev mus ntsib yaml.org thiab rov nyeem cov specifications (specs). Yog tias koj muaj teeb meem nrog YAML, tab sis tsis tau mus txog qhov tshwj xeeb, ces nws yog lub sijhawm los kho qhov xwm txheej no. Cov specs yog qhov xav tsis thoob yooj yim sau, thiab cov kev cai syntax tau piav qhia nrog ntau tus piv txwv hauv Tshooj 6.

5. Pseudo-configs

Thaum sau ib phau ntawv lossis kab lus, nws yeej ib txwm muaj txiaj ntsig los ua ntej kos duab ua ntej, yam tsawg kawg hauv daim ntawv ntawm cov ntsiab lus. Nws zoo ib yam nrog YAML. Feem ntau, koj muaj lub tswv yim ntawm cov ntaub ntawv dab tsi yuav tsum tau sau rau hauv YAML cov ntaub ntawv, tab sis koj tsis tshua nkag siab tias yuav txuas nrog ib leeg li cas. Yog li ntawd, ua ntej sculpting YAML, kos ib pseudo-config.

Pseudo-config zoo ib yam li pseudo-code, qhov uas koj tsis tas yuav txhawj xeeb txog cov qauv lossis kev nkag mus, kev sib raug zoo ntawm niam txiv-me nyuam, qub txeeg qub teg thiab zes. Nws zoo ib yam ntawm no: koj kos iterations ntawm cov ntaub ntawv thaum lawv tshwm sim hauv koj lub taub hau.

10 kauj ruam rau YAML Zen

Pseudo-config npe programmers (Martin thiab Tabitha) thiab lawv cov kev txawj ntse (cov lus programming: Python, Perl, Pascal thiab Lisp, Fortran, Erlang, feem).

Tom qab kos duab pseudo-config ntawm ib daim ntawv, ua tib zoo txheeb xyuas nws thiab, yog tias txhua yam nyob rau hauv kev txiav txim, format nws nyob rau hauv daim ntawv ntawm ib tug siv tau YAML ntaub ntawv.

6. Lub Tabs vs. Spaces Dilemma

Koj yuav tau daws qhov teeb meem "tabs lossis qhov chaw?". Tsis yog nyob rau hauv lub ntiaj teb no, tab sis tsuas yog nyob rau theem ntawm koj lub koom haum, los yog tsawg kawg yog ib qhov project. Nws tsis muaj teeb meem yog tias qhov no suav nrog kev siv tom qab ua tiav nrog cov ntawv sau, teeb tsa cov ntawv sau ntawm cov programmers lub tshuab, lossis thoob ntiaj teb tau txais cov ntawv txais nyiaj ntawm kev ua raws li cov lus qhia nruj me ntsis raws li kev hem thawj ntawm kev tshem tawm, tab sis txhua tus tswv cuab ntawm koj pab neeg hauv ib txoj kev lossis lwm qhov cuam tshuam rau YAML yuav tsum siv qhov chaw xwb (raws li qhov xav tau los ntawm YAML specification).

Hauv txhua cov ntawv nyeem ib txwm muaj, koj tuaj yeem teeb tsa nws pib-kho tab rau ib qho chaw tshwj xeeb, yog li kev tawm tsam ntawm cov neeg koom nrog tseem ceeb Tab koj tsis tas yuav ntshai.

Raws li txhua tus YAML hater paub zoo, koj tsis tuaj yeem pom qhov txawv ntawm tabs thiab qhov chaw ntawm lub vijtsam. Thiab thaum ib yam dab tsi tsis pom, feem ntau yog qhov kawg uas tib neeg nco qab, tom qab lawv tau txheeb xyuas, txheeb xyuas thiab tshem tawm tag nrho lwm yam teeb meem tshwm sim. Ib teev ntawm lub sij hawm siv mus nrhiav ib tug tabulation nkhaus los yog ib tug thaiv ntawm qhov chaw tsuas yog qw hais tias koj urgently yuav tsum tau tsim ib txoj cai rau kev siv ntawm ib tug los yog lwm yam, thiab ces siv ib tug ntxiv dag zog rau kev ua raws li nws (piv txwv li, los ntawm Git nuv kom yuam nws los ntawm linter).

7. Tsawg yog ntau (lossis ntau dua yog tsawg)

Qee tus neeg nyiam sau ntawv hauv YAML vim nws hais txog cov qauv. Nyob rau tib lub sijhawm, lawv nquag siv indentation los qhia txog cov ntaub ntawv thaiv. Qhov no yog hom kev dag ntxias kom ua raws li cov lus kos npe uas siv cov lus qhia meej meej.

Ntawm no yog ib qho piv txwv ntawm xws li qauv los ntawm Cov ntaub ntawv tsis raug:

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

Rau qee tus, qhov kev xaiv no pab lawv txheeb xyuas YAML cov qauv hauv lawv lub taub hau; rau lwm tus, ntawm qhov tsis sib xws, nws ua rau lawv muaj ntau yam tsis tsim nyog, hauv lawv lub tswv yim, indents.

Tab sis yog tias koj yog tus tswv ntawm YAML cov ntaub ntawv thiab muaj lub luag haujlwm los tswj nws, ces koj thiab koj xwb yuav tsum tau piav qhia yuav ua li cas siv indentation. Yog tias koj ntxhov siab los ntawm cov padding loj, khaws nws mus rau qhov tsawg kawg nkaus raws li YAML specification. Piv txwv li, cov ntaub ntawv saum toj no los ntawm Ansible cov ntaub ntawv tuaj yeem rov sau dua li qhov no yam tsis muaj kev poob:

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

8. Siv qhov khoob

Yog tias koj pheej rov ua qhov yuam kev qub thaum sau cov ntaub ntawv YAML, nws ua rau muaj kev nkag siab zoo rau ntxig ib tus qauv rau hauv nws raws li cov lus pom. Tom qab ntawd lwm zaus koj tuaj yeem luam cov qauv no thiab nkag mus rau cov ntaub ntawv tiag tiag muaj, piv txwv li:

---
# - <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. Siv tej yam txawv

Yog tias daim ntawv thov tsis muaj qhov stranglehold rau koj, ces nws yuav tsim nyog hloov YAML rau lwm hom ntawv. Sij hawm dhau mus, cov ntaub ntawv teeb tsa tuaj yeem nthuav tawm lawv tus kheej thiab tom qab ntawd nws yog qhov zoo dua los hloov lawv mus rau hauv cov ntawv yooj yim hauv Lua lossis Python.

YAML yog qhov zoo tshaj plaws uas ntau tus neeg nyiam rau nws qhov minimalism thiab simplicity, tab sis nws nyob deb ntawm tib lub cuab yeej hauv koj lub arsenal. Yog li qee zaum koj tuaj yeem tsis kam lees nws. Cov tsev qiv ntawv txheeb xyuas tau yooj yim nrhiav rau YAML, yog li yog tias koj muab kev xaiv yooj yim tsiv teb tsaws, koj cov neeg siv yuav muaj sia nyob qhov ua tsis tiav no tsis mob.

Yog tias koj tsis tuaj yeem ua yam tsis muaj YAML, tom qab ntawd coj cov lus qhia 10 no thiab kov yeej koj qhov tsis nyiam YAML ib zaug thiab rau tag nrho!

Tau qhov twg los: www.hab.com

Ntxiv ib saib