Մենք բոլորս սիրում ենք Ansible-ը, բայց Ansible-ը YAML-ն է: Կան կազմաձևման ֆայլերի բազմաթիվ ձևաչափեր՝ արժեքների ցուցակներ, պարամետր-արժեք զույգեր, INI ֆայլեր, YAML, JSON, XML և շատ ուրիշներ: Այնուամենայնիվ, բոլորից մի քանի պատճառներով YAML-ը հաճախ համարվում է հատկապես դժվար: Մասնավորապես, չնայած իր թարմացնող մինիմալիզմին և հիերարխիկ արժեքների հետ աշխատելու տպավորիչ հնարավորություններին, YAML-ի շարահյուսությունը կարող է զայրացնել իր Python-ի նման մոտեցման հետքերով:
Եթե YAML-ը ձեզ բարկացնում է, կարող եք և պետք է: – կատարեք հետևյալ 10 քայլերը՝ ձեր հիասթափությունը ընդունելի մակարդակի իջեցնելու և YAML-ին սիրահարվելու համար: Ինչպես վայել է այս ցանկին, մեր տասը խորհուրդները կհամարակալվեն զրոյից, մենք կավելացնենք մեդիտացիա և հոգևոր պրակտիկա ըստ ցանկության 😉
0. Ստիպեք ձեր խմբագրին աշխատել
Կարևոր չէ, թե ինչ տեքստային խմբագրիչ ունեք, հավանաբար կա առնվազն մեկ պլագին YAML-ի հետ աշխատելու համար: Եթե չունեք, անմիջապես գտեք և տեղադրեք: Որոնման և տեղադրման վրա ծախսված ժամանակը շատ անգամ կվճարի ամեն անգամ, երբ դուք պետք է խմբագրեք YAML-ը:
Օրինակ՝ խմբագիր
Emacs-ը YAML ռեժիմում և բացատների ցուցադրում:
Եթե ձեր սիրելի խմբագրիչը չունի YAML ռեժիմ, ապա որոշ խնդիրներ կարելի է լուծել՝ աշխատելով կարգավորումների հետ։ Օրինակ, ստանդարտ GNOME տեքստային խմբագրիչ Gedit-ը չունի YAML ռեժիմ, բայց լռելյայնորեն այն կարևորում է YAML շարահյուսությունը և թույլ է տալիս կարգավորել աշխատանքը ինտացիաներով.
Gedit-ում նահանջների տեղադրում:
Փլագին
Այլ կերպ ասած, ժամանակ տրամադրեք ձեր սիրելի խմբագրի մասին սովորելուն: Պարզեք, թե ինչ է առաջարկում նա կամ նրա զարգացման համայնքը YAML-ի հետ աշխատելու համար և օգտագործեք այդ հնարավորությունները: Դուք հաստատ չեք փոշմանի։
1. Օգտագործեք լիսեռ
Իդեալում, ծրագրավորման լեզուները և նշագրման լեզուները օգտագործում են կանխատեսելի շարահյուսություն: Համակարգիչները լավ են կանխատեսելիության մեջ, ինչի պատճառով էլ հասկացությունը
Տեղադրելու համար
$ sudo dnf install yamllint
Այնուհետև դուք պարզապես գործարկում եք yamllint՝ փոխանցելով այն YAML ֆայլը՝ ստուգելու համար: Ահա թե ինչ տեսք կունենա, եթե սխալով ֆայլը փոխանցեք linter-ին.
$ yamllint errorprone.yaml
errorprone.yaml
23:10 error syntax error: mapping values are not allowed here
23:11 error trailing spaces (trailing-spaces)
Ձախ կողմում գտնվող թվերը ոչ թե ժամանակը, այլ սխալի կոորդինատներն են՝ տողի և սյունակի համարը: Սխալի նկարագրությունը կարող է ձեզ ոչինչ չասել, բայց դուք հստակ գիտեք, թե որտեղ է այն: Պարզապես նայեք այս տեղը կոդի մեջ, և, ամենայն հավանականությամբ, ամեն ինչ պարզ կդառնա:
Երբ yamllint-ը ֆայլում սխալներ չի գտնում, ոչինչ չի տպվում էկրանին: Եթե նման լռությունը ձեզ վախեցնում է, և դուք մի փոքր ավելի շատ արձագանք եք ուզում, ապա կարող եք գործարկել լինտերը պայմանական echo հրամանով կրկնակի նշանի (&&) միջոցով, այսպես.
$ yamllint perfect.yaml && echo "OK"
OK
POSIX-ում կրկնակի ամպերսանդը գործարկվում է, եթե և միայն այն դեպքում, երբ նախորդ հրամանը վերադարձնում է 0: Իսկ yamllint-ը պարզապես վերադարձնում է հայտնաբերված սխալների քանակը, ինչի պատճառով այս ամբողջ պայմանական կոնստրուկցիան աշխատում է:
2. Գրեք Python-ով, ոչ թե YAML-ով
Եթե YAML-ն իսկապես ջղայնացնում է ձեզ, պարզապես մի գրեք դրա մեջ, բառացիորեն: Պատահում է, որ YAML-ը միակ ձևաչափն է, որը հավելվածը հասկանում է: Բայց նույնիսկ այս դեպքում անհրաժեշտ չէ ստեղծել YAML ֆայլ: Գրեք այն, ինչ ձեզ դուր է գալիս, ապա փոխարկեք: Օրինակ, Python-ի համար հիանալի գրադարան կա
Ինքնափոխություն
Այս դեպքում տվյալների ֆայլը նաև Python-ի սցենար է, որը ստեղծում է YAML: Այս մեթոդը լավագույնս համապատասխանում է փոքր տվյալների հավաքածուներին: Դուք պարզապես գրում եք JSON-ի տվյալները Python փոփոխականի մեջ, նախաբանում այն ներմուծման հրահանգով և ֆայլի վերջում ավելացնում եք երեք տող՝ արդյունքն իրականացնելու համար:
#!/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
Այժմ մենք գործարկում ենք այս ֆայլը Python-ում և ստանում 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
Սա լիովին վավեր է YAML-ով, բայց yamllint-ը կզգուշացնի ձեզ, որ այն չի սկսվում -ով: Դե, սա կարելի է հեշտությամբ շտկել ձեռքով կամ մի փոքր փոփոխել Python սկրիպտում:
Փոխակերպում սկրիպտների միջոցով
Այս դեպքում մենք նախ գրում ենք JSON-ով, այնուհետև գործարկում ենք փոխարկիչը որպես առանձին Python սկրիպտ, որը արտադրում է YAML որպես ելք։ Նախորդ մեթոդի համեմատ այս մեթոդը ավելի լավ է մասշտաբվում, քանի որ փոխակերպումը տվյալներից առանձին է:
Նախ, եկեք ստեղծենք JSON ֆայլ example.json, օրինակ, կարող եք վերցնել այն
{
"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"
}
}
}
}
}
Այնուհետև մենք կստեղծենք փոխարկիչի պարզ սցենար և կպահենք այն json2yaml.py անունով: Այս սկրիպտը ներմուծում է և՛ YAML, և՛ JSON Python մոդուլները և բեռնում է օգտագործողի կողմից նշված JSON ֆայլը, կատարում է փոխարկումը և տվյալները գրում 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()
Պահպանեք այս սկրիպտը համակարգի ճանապարհին և գործարկեք այն ըստ անհրաժեշտության.
$ ~/bin/json2yaml.py example.json
3. Շատ ու հաճախ վերլուծիր
Երբեմն օգտակար է խնդրին այլ տեսանկյունից նայել: Եթե դժվարանում եք ներկայացնել ձեր տվյալների միջև հարաբերությունները YAML-ում, կարող եք դրանք ժամանակավորապես վերածել ավելի ծանոթ բանի:
Օրինակ, եթե ձեզ հարմար է բառարանների ցուցակների կամ JSON-ի հետ աշխատելը, կարող եք YAML-ը փոխարկել JSON-ի ընդամենը երկու հրամանով Python-ի ինտերակտիվ վահանակում: Ենթադրենք, դուք ունեք YAML ֆայլ mydata.yaml, ապա այն այսպիսի տեսք կունենա.
$ 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.'}
Այս թեմայով կարող եք գտնել բազմաթիվ այլ օրինակներ: Բացի այդ, կան բազմաթիվ առցանց փոխարկիչներ և տեղական վերլուծիչներ: Այնպես որ, մի հապաղեք վերաձեւակերպել տվյալները, երբ դրանցում միայն անհասկանալի խառնաշփոթ եք տեսնում:
4. Կարդացեք բնութագրերը
Երկար ընդմիջումից հետո վերադառնալով ՅԱՄԼ՝ օգտակար է այցելել
5. Pseudo-configs
Գիրք կամ հոդված գրելիս միշտ օգտակար է նախ ուրվագծել նախնական ուրվագիծը, գոնե բովանդակության աղյուսակի տեսքով: Նույնն է YAML-ի դեպքում: Ամենայն հավանականությամբ, դուք պատկերացում ունեք, թե ինչ տվյալներ պետք է գրվեն YAML ֆայլում, բայց իրականում չեք հասկանում, թե ինչպես դրանք կապել միմյանց հետ: Հետևաբար, նախքան YAML-ը քանդակելը, նկարեք կեղծ կոնֆիգուրացիա:
Pseudo-config-ը նման է կեղծ կոդի, որտեղ դուք չպետք է անհանգստանաք կառուցվածքի կամ խորշի, ծնող-երեխա հարաբերությունների, ժառանգության և բնադրման մասին: Նույնն է այստեղ. դուք նկարում եք տվյալների կրկնությունները, երբ դրանք առաջանում են ձեր գլխում:
Pseudo-config ցուցակագրող ծրագրավորողներ (Martin և Tabitha) և նրանց հմտությունները (ծրագրավորման լեզուներ՝ Python, Perl, Pascal և Lisp, Fortran, Erlang, համապատասխանաբար):
Թղթի վրա կեղծ կոնֆիգուրացիա նկարելուց հետո, ուշադիր վերլուծեք այն և, եթե ամեն ինչ կարգին է, ձևաչափեք վավեր YAML ֆայլի տեսքով:
6. «Tabs vs. Spaces» երկընտրանքը
Դուք ստիպված կլինեք լուծել երկընտրանքը
Ցանկացած նորմալ տեքստային խմբագրիչում դուք կարող եք կարգավորել ավտոմատ շտկել ներդիրները որոշակի քանակությամբ բացատների վրա, ինչը հանգեցնում է հիմնական հետևորդների ապստամբությանը: Tab պետք չէ վախենալ.
Ինչպես YAML-ի յուրաքանչյուր ատող լավ գիտի, դուք չեք կարող տեսնել տարբերությունը ներդիրների և բացատների միջև էկրանին: Եվ երբ ինչ-որ բան տեսանելի չէ, դա սովորաբար վերջին բանն է, որ հիշում են մարդիկ, այն բանից հետո, երբ նրանք դասավորել են, ստուգել և վերացնել մնացած բոլոր հնարավոր խնդիրները: Աղյուսակավորման կորի կամ տարածությունների բլոկի որոնման վրա ծախսված ժամանակի մեկ ժամն ուղղակի բղավում է, որ դուք շտապ պետք է քաղաքականություն ստեղծեք մեկի կամ մյուսի օգտագործման համար, այնուհետև իրականացնեք երկաթբետոնե ստուգում դրա համապատասխանության համար (օրինակ՝ միջոցով Git-ի կեռիկ՝ այն ստիպելու համար, որ այն անցնի լիսեռի միջով):
7. Less is more (կամ ավելին ավելի քիչ)
Որոշ մարդիկ սիրում են գրել YAML-ով, քանի որ այն ընդգծում է կառուցվածքը: Միևնույն ժամանակ, նրանք ակտիվորեն օգտագործում են ներքևում՝ ընդգծելու տվյալների բլոկները: Սա մի տեսակ խաբեություն է՝ ընդօրինակելու նշագծման լեզուները, որոնք օգտագործում են բացահայտ սահմանազատիչներ:
Ահա այսպիսի կառուցվածքի օրինակ
# Employee records
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
Ոմանց համար այս տարբերակը օգնում է նրանց գլխի մեջ կարգավորել YAML կառուցվածքը, մյուսների համար, ընդհակառակը, դա նյարդայնացնում է շատ ավելորդ, իրենց կարծիքով, ներքևերով:
Բայց եթե դուք YAML փաստաթղթի սեփականատերն եք և պատասխանատու եք դրա պահպանման համար, ապա դու և միայն դու պետք է սահմանի, թե ինչպես օգտագործել նահանջը: Եթե ձեզ զայրացնում է մեծ լցոնումը, պահեք այն հնարավորինս նվազագույնի` համաձայն YAML-ի բնութագրերի: Օրինակ, Ansible փաստաթղթերից վերը նշված ֆայլը կարող է վերաշարադրվել այսպես՝ առանց որևէ կորստի.
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. Օգտագործեք բլանկներ
Եթե դուք անընդհատ կրկնում եք նույն սխալները YAML ֆայլը լրացնելիս, ապա իմաստ ունի կաղապար տեղադրել դրա մեջ որպես մեկնաբանություն։ Այնուհետև հաջորդ անգամ կարող եք պարզապես պատճենել այս ձևանմուշը և այնտեղ մուտքագրել իրական տվյալներ, օրինակ.
---
# - <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. Օգտագործեք այլ բան
Եթե հավելվածը ձեզ վրա խեղդող պահոց չունի, ապա գուցե արժե փոխել YAML-ը այլ ձևաչափով: Ժամանակի ընթացքում կազմաձևման ֆայլերը կարող են գերազանցել իրենց, և այնուհետև ավելի լավ է դրանք վերածել պարզ սցենարների Lua-ում կամ Python-ում:
YAML-ը հիանալի բան է, որը շատերն են սիրում իր մինիմալիզմի և պարզության համար, բայց այն հեռու է ձեր զինանոցի միակ գործիքից: Այսպիսով, երբեմն դուք կարող եք հրաժարվել դրանից: Վերլուծական գրադարանները հեշտ է գտնել YAML-ի համար, այնպես որ, եթե դուք առաջարկում եք միգրացիայի հեշտ տարբերակներ, ձեր օգտատերերը համեմատաբար ցավալիորեն կվերապրեն այս ձախողումը:
Եթե դուք չեք կարող անել առանց YAML-ի, ապա հետևեք այս 10 խորհուրդներին և մեկընդմիշտ հաղթահարեք ձեր հակակրանքը YAML-ի նկատմամբ:
Source: www.habr.com