YAML Zen üçün 10 addım

Biz hamımız Ansible-ı sevirik, lakin Ansible YAML-dir. Konfiqurasiya faylları üçün bir çox format var: dəyərlər siyahıları, parametr-dəyər cütləri, INI faylları, YAML, JSON, XML və bir çox başqaları. Bununla belə, bir neçə səbəbə görə, hamısından YAML çox vaxt xüsusilə çətin hesab olunur. Xüsusilə, təravətləndirici minimalizmə və iyerarxik dəyərlərlə işləmək üçün təsir edici imkanlara baxmayaraq, YAML sintaksisi girintiyə Python kimi yanaşması ilə bezdirici ola bilər.

YAML Zen üçün 10 addım

YAML sizi əsəbiləşdirirsə, edə bilərsiniz - və etməlisiniz! - qıcıqlanmanızı məqbul səviyyəyə endirmək üçün növbəti 10 addımı atın və YAML-i sevin. Bu siyahıya uyğun olaraq, on məsləhətimiz sıfırdan nömrələnəcək, istədiyiniz kimi meditasiya və mənəvi təcrübələr əlavə edirik 😉

0. Redaktorunuzu işləyin

Hansı mətn redaktorunuz olmasının fərqi yoxdur, yəqin ki, onun üçün ən azı bir YAML plagini var. Əgər sizdə yoxdursa, dərhal tapın və quraşdırın. Axtarış və tənzimləmə üçün sərf etdiyiniz vaxt YAML-i redaktə etmək üçün lazım olan hər dəfə dəfələrlə bəhrəsini verəcəkdir.

Məsələn, redaktor Atom standart olaraq YAML-i dəstəkləyir, lakin GNU Emacs üçün əlavə paketlər quraşdırmalı olacaqsınız, məsələn, yaml rejimi.

YAML Zen üçün 10 addım

YAML rejimində Emacs və boşluqları göstərir.

Sevimli redaktorunuzda YAML rejimi yoxdursa, o zaman bəzi problemləri parametrlərlə işləməklə həll etmək olar. Məsələn, GNOME üçün standart mətn redaktoru Gedit-də YAML rejimi yoxdur, lakin standart olaraq YAML sintaksisini vurğulayır və abzasları fərdiləşdirməyə imkan verir:

YAML Zen üçün 10 addım

Gedit-də abzasların təyin edilməsi.

Plugin çəkmə boşluqları Gedit üçün boşluqları nöqtə kimi göstərir, girinti səviyyələri ilə qeyri-müəyyənlikləri aradan qaldırır.

Başqa sözlə, sevimli redaktorunuzu öyrənmək üçün vaxt ayırın. Onun və ya inkişaf cəmiyyətinin YAML ilə işləmək üçün nə təklif etdiyini öyrənin və bu imkanlardan yararlanın. Siz mütləq peşman olmayacaqsınız.

1. Linterdən istifadə edin

İdeal olaraq, proqramlaşdırma dilləri və işarələmə dilləri proqnozlaşdırıla bilən sintaksisdən istifadə edir. Kompüterlər proqnozlaşdırma qabiliyyətinə malikdir, buna görə də bu konsepsiya hələ 1978-ci ildə yaranıb linter. Əgər mövcud olduğu 40 il ərzində o, sizdən yan keçibsə və siz hələ də YAML linterindən istifadə etmirsinizsə, o zaman yamllint-i sınamağın vaxtıdır.

Quraşdırın yamllint Doğma Linux paket menecerindən istifadə edə bilərsiniz. Məsələn, in Red Hat Enterprise Linux 8 və ya Fedora bu belə edilir:

$ sudo dnf install yamllint

Daha sonra sınamaq üçün YAML faylını ötürərək yamllint-i işə salırsınız. Səhvli faylı linterə ötürsəniz, belə görünür:

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

Soldakı rəqəmlər vaxt deyil, xətanın koordinatlarıdır: sətir və sütunun nömrəsi. Xətanın təsviri sizə heç nə deməyə bilər, ancaq onun harada olduğunu dəqiq bilirsiniz. Sadəcə koddakı bu yerə baxın və çox güman ki, hər şey aydın olacaq.

Yamllint faylda heç bir səhv tapmayanda ekrana heç nə çap olunmur. Əgər belə səssizlik sizi qorxudursa və bir az daha çox rəy istəsəniz, o zaman echo şərti əmri ilə linteri qoşa ampersand (&&) vasitəsilə işlədə bilərsiniz:

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

POSIX-də qoşa işarə yalnız və yalnız əvvəlki əmr 0-a qayıtdıqda işə düşür.

2. YAML deyil, Python ilə yazın

YAML həqiqətən sizi əsəbiləşdirirsə, sadəcə olaraq, hərfi mənada yazmayın. Belə olur ki, YAML proqram tərəfindən qəbul edilən yeganə formatdır. Amma bu halda YAML faylı yaratmaq lazım deyil. Bəyəndiyinizi yazın, sonra çevirin. Məsələn, Python üçün əla bir kitabxana var pyyaml və çevirməyin iki bütöv yolu: özünü çevirmək və skriptlər vasitəsilə çevirmək.

Öz-özünə çevrilmə

Bu halda, məlumat faylı həm də YAML yaradan Python skriptidir. Bu üsul kiçik verilənlər bazası üçün ən yaxşısıdır. Siz sadəcə olaraq JSON məlumatlarını Python dəyişəninə yazırsınız, onu idxal direktivi ilə prefiks edirsiniz və çıxışı həyata keçirmək üçün faylın sonuna üç sətir əlavə edirsiniz.

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

İndi bu faylı Python-da işlədirik və çıxış kimi output.yaml faylını alırıq:

$ 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

Bu, tamamilə etibarlı YAML-dir, lakin yamllint sizi xəbərdar edəcək ki, bu - ilə başlamaz. Yaxşı, bu asanlıqla əl ilə düzəldilə bilər və ya Python skripti ilə bir az düzəldilə bilər.

Skriptlər vasitəsilə konvertasiya

Bu halda biz əvvəlcə JSON-da yazırıq, sonra isə konvertoru çıxış kimi YAML istehsal edən ayrıca Python skripti kimi işlədirik. Əvvəlki üsulla müqayisədə, bu üsul daha yaxşı miqyas alır, çünki konversiya verilənlərdən ayrılır.

Əvvəlcə nümunə.json JSON faylını yaradaq, məsələn, onu buradan götürə bilərsiniz 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"
			}
		  }
		}
	  }
	}

Sonra sadə bir çevirici skript yaradaq və onu json2yaml.py olaraq qeyd edək. Bu skript həm YAML, həm də JSON Python modullarını idxal edir, istifadəçi tərəfindən müəyyən edilmiş JSON faylını yükləyir, çevrilməni həyata keçirir və məlumatları output.yaml faylına yazır.

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

Bu skripti sistem yoluna saxlayın və lazım olduqda işə salın:

$ ~/bin/json2yaml.py example.json

3. Çox və tez-tez təhlil edin

Bəzən problemə başqa tərəfdən baxmaq kömək edir. Əgər YAML-də məlumatlar arasındakı əlaqələri təmsil etməkdə çətinlik çəkirsinizsə, onları müvəqqəti olaraq daha tanış bir şeyə çevirə bilərsiniz.

Məsələn, lüğət siyahıları və ya JSON ilə işləmək rahatdırsa, YAML interaktiv Python qabığında yalnız iki əmrlə JSON-a çevrilə bilər. Tutaq ki, sizdə mydata.yaml YAML faylınız var, onda o, belə görünür:

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

Bu mövzuda bir çox başqa nümunələr var. Bundan əlavə, çoxlu onlayn çeviricilər və yerli analizatorlar mövcuddur. Odur ki, onda yalnız anlaşılmaz bir qarışıqlıq gördüyünüz zaman məlumatları yenidən formatlamaqdan çekinmeyin.

4. Xüsusiyyətləri oxuyun

Uzun bir fasilədən sonra YAML-ə qayıdarkən, yoxlamaq faydalıdır yaml.org və spesifikasiyaları (spesifikasiyaları) yenidən oxuyun. YAML ilə bağlı çətinlikləriniz varsa, lakin əlləriniz spesifikasiyaya çatmayıbsa, bu vəziyyəti düzəltməyin vaxtı gəldi. Xüsusiyyətləri yazmaq təəccüblü dərəcədə asandır və sintaksis tələbləri çoxlu nümunələrlə təsvir edilmişdir. Fəsil 6.

5. Pseudoconfigs

Kitab və ya məqalə yazarkən, ilk növbədə, heç olmasa məzmun cədvəli şəklində ilkin kontur çəkmək həmişə yaxşı olar. YAML ilə eyni. Çox güman ki, YAML faylına hansı məlumatların yazılması barədə bir fikrin var, lakin onları bir-biri ilə necə əlaqələndirəcəyini başa düşmürsən. Buna görə də, YAML heykəltəraşlıq etməzdən əvvəl psevdokonfiqurasiya çəkin.

Pseudoconfig psevdokoda bənzəyir, burada struktur və ya girinti, valideyn-övlad münasibətləri, miras və yuva haqqında narahat olmaq lazım deyil. Beləliklə, buradadır: məlumatların başınızda göründüyü kimi iterasiyalarını çəkirsiniz.

YAML Zen üçün 10 addım

Pseudoconfig siyahısı proqramçılar (Martin və Tabitha) və onların bacarıqları (proqramlaşdırma dilləri: Python, Perl, Pascal və Lisp, Fortran, Erlang, müvafiq olaraq).

Bir kağız parçasına psevdo-konfiqurasiya çəkdikdən sonra onu diqqətlə təhlil edin və hər şey qaydasındadırsa, onu etibarlı YAML faylı kimi formatlaşdırın.

6. Nişanlar və ya Boşluqlar Dilemması

Siz dilemmanı həll etməlisiniz "tablar və ya boşluqlar?". Qlobal mənada deyil, yalnız təşkilatınızın səviyyəsində və ya ən azı bir layihə. Bunun sed skripti ilə post-processing, proqramçıların maşınlarında mətn redaktorlarının qurulması və ya işdən çıxarılma təhlükəsi altında linter təlimatlarına ciddi riayət edilməsi üçün qəbzlərin alınmasını ehtiva etməsinin əhəmiyyəti yoxdur, ancaq komandanızın bütün üzvləri birində YAML-ə aid olan yol və ya digər yol yalnız boşluqlardan istifadə etməlidir (YAML spesifikasiyası tələb etdiyi kimi).

Hər hansı bir normal mətn redaktorunda, müəyyən bir sıra boşluqlar üçün nişanların avtomatik dəyişdirilməsini qura bilərsiniz, belə ki, açarın tərəfdarlarının üsyanı. Tab qorxmaq olmaz.

Hər bir YAML nifrətçisi yaxşı bilir ki, ekrandakı nişanlar və boşluqlar arasında heç bir fərq yoxdur. Və bir şey görünmədikdə, bir qayda olaraq, bütün digər mümkün problemlər sıralandıqdan, yoxlanıldıqdan və aradan qaldırıldıqdan sonra sonuncu xatırlanır. Bir nişan və ya boşluq blokunu axtarmağa sərf olunan bir saat vaxt sadəcə olaraq qışqırır ki, siz təcili olaraq bu və ya digərindən istifadə siyasəti yaratmalı və sonra onun uyğunluğu üçün dəmir-beton yoxlama aparmalısınız (məsələn, Git çəngəl vasitəsilə linterdən qaçmağa məcbur edin).

7. Az daha yaxşıdır (yaxud daha çox azdır)

Bəzi insanlar YAML-də yazmağı xoşlayır, çünki o, strukturu vurğulayır. Eyni zamanda, məlumat bloklarını vurğulamaq üçün abzaslardan fəal istifadə edirlər. Bu, açıq-aşkar məhdudlaşdırıcılardan istifadə edən işarələmə dillərini təqlid etmək bir növ fırıldaqdır.

Budur belə bir quruluşa bir nümunə Ansible sənədlər:

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

Bəziləri üçün bu seçim YAML strukturunu başlarında parçalamağa kömək edir, digərləri üçün isə əksinə, onları lazımsız, onların fikrincə, girinti kütləsi ilə qıcıqlandırır.

Ancaq YAML sənədinin sahibisinizsə və onun saxlanmasına cavabdehsinizsə, o zaman sən və yalnız sən girintinin necə istifadə olunacağını müəyyən etməlidir. Böyük girinti sizi qıcıqlandırarsa, YAML spesifikasiyasına uyğun olaraq onu mümkün olan minimuma qədər saxlayın. Məsələn, Ansible sənədlərindən yuxarıda göstərilən fayl itkisiz bu şəkildə yenidən yazıla bilər:

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

8. Blanklardan istifadə edin

YAML faylını doldurarkən eyni səhvləri təkrarlasanız, şərh olaraq boş şablon daxil etməyin mənası var. Sonra növbəti dəfə sadəcə bu boşluğu kopyalayıb ora real məlumatları daxil edə bilərsiniz, məsələn:

---
# - <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. Fərqli bir şey istifadə edin

Tətbiqdə sizin üzərinizdə boğulma yoxdursa, YAML-i başqa formata dəyişməyə dəyər ola bilər. Vaxt keçdikcə konfiqurasiya faylları özlərini üstələyə bilər və sonra onları sadə Lua və ya Python skriptlərinə çevirmək daha yaxşıdır.

YAML bir çox insanın minimalizmi və sadəliyi ilə sevdiyi əla bir şeydir, lakin o, arsenalınızdakı yeganə vasitədən uzaqdır. Buna görə bəzən ondan imtina edə bilərsiniz. YAML üçün təhlil kitabxanalarını tapmaq asandır, buna görə də rahat miqrasiya variantları təklif etsəniz, istifadəçiləriniz nisbətən ağrısız şəkildə belə bir imtinadan sağ çıxacaqlar.

Əgər YAML olmadan edə bilmirsinizsə, onda bu 10 məsləhəti istifadə edin və YAML-ə olan xoşagəlməzliyinizi birdəfəlik məğlub edin!

Mənbə: www.habr.com

Добавить комментарий