YAML یک فرمت فایل پیکربندی قابل خواندن برای انسان است که انعطاف پذیر و به راحتی قابل درک است، اما مملو از مشکلات غیرمنتظره است. در اینجا نحوه اجتناب از مخاطره آمیزترین مسائل آن آمده است.
- در صورت شک، رشته ها را نقل قول کنید
- مراقب رشته های چند خطی باشید
- مراقب بولین ها باشید
- مراقب چندین اشکال اکتال باشید
- مراقب YAML قابل اجرا باشید
- هنگام سریالسازی و سریالزدایی از ناهماهنگیها مراقبت کنید
- از YAML استفاده نکنید
زبان پیکربندی YAML (“YAML Ain’t Markup Language”) در قلب بسیاری از برنامه های مدرن از جمله Kubernetes، Ansible، CircleCI و Salt قرار دارد. از این گذشته، YAML مزایای زیادی مانند خوانایی، انعطاف پذیری، و توانایی کار با فایل های JSON را ارائه می دهد. اما YAML همچنین منبعی از دام ها و مشکلات برای افراد ناآگاه یا بی احتیاط است.
بسیاری از جنبههای رفتار YAML امکان راحتی لحظهای را فراهم میآورد، اما به قیمت زیگها یا زاگهای غیرمنتظره در آینده. حتی افرادی که تجربه زیادی در مونتاژ یا استقرار YAML دارند نیز ممکن است تحت تأثیر این مسائل قرار گیرند، که اغلب در ظاهر رفتارهای به ظاهر بی ضرر ظاهر می شوند.
در اینجا هفت مرحله وجود دارد که میتوانید برای محافظت در برابر دردسرسازترین مشکلات در YAML بردارید.
در صورت شک، رشته ها را نقل قول کنید
قوی ترین تمرین دفاعی که می توانید هنگام نوشتن YAML اتخاذ کنید: هر چیزی را که قرار است یک رشته باشد، نقل قول کنید.
یکی از شناخته شده ترین ویژگی های YAML این است که می توانید رشته ها را بدون نقل قول بنویسید:
- movie: title: Blade Runner year: 1982
در این مثال، کلیدهای movie
، title
و year
بهعنوان رشته و مقدار Blade تفسیر میشوند. دونده
. مقدار ۱۹۸۲
به عنوان یک عدد تجزیه خواهد شد.
اما اینجا چه اتفاقی میافتد؟
- movie: title: 1979 year: 2016
درست است—عنوان فیلم به عنوان یک عدد تفسیر خواهد شد. و این حتی بدترین چیزی نیست که ممکن است اتفاق بیفتد:
- movie: title: No year: 2012
چه شانسی وجود دارد که این عنوان به عنوان یک بولی تفسیر شود؟
اگر میخواهید کاملاً مطمئن شوید که کلیدها و مقادیر بهعنوان رشتهها تفسیر میشوند و از هرگونه ابهام احتمالی محافظت کنید (و بسیاری از ابهامها میتوانند در YAML رخنه کنند)، سپس رشتههای خود را نقل قول کنید:
- "movie": "title": "Blade Runner" "year": 1982
اگر به دلایلی نمیتوانید رشتهها را نقل قول کنید، میتوانید از یک پیشوند کوتاه برای نشان دادن نوع اینها خواندن YAML را کمی سر و صداتر از رشتههای نقلقولشده میسازد، اما به همان اندازه که نقل قول میکنند مبهم هستند:
movie: !!str Blade Runner
مراقب رشته های چند خطی باشید
YAML راههای متعددی برای نمایش رشتههای چندخطی دارد، بسته به نحوه قالببندی آن رشتهها. به عنوان مثال، رشتههای نقل قول نشده را میتوان به سادگی در چندین خط شکست، زمانی که پیشوند یک >
:
باشد.
long string: > This is a long string that spans multiple lines.
توجه داشته باشید که استفاده از >
به طور خودکار یک \n
را در انتهای رشته اضافه می کند. اگر خط جدید بعدی را نمیخواهید، به جای >
از >-
استفاده کنید.
اگر از رشتههای نقل قول استفاده میکنید، باید پیشگفتار هر شکست خط را با یک اسلش معکوس کنید:
long string: "This is a long string \ that spans multiple lines."
توجه داشته باشید که هر فاصله پس از شکست خط به عنوان قالب بندی YAML تفسیر می شود، نه به عنوان بخشی از رشته. به همین دلیل است که در مثال بالا، فاصله قبل از بک اسلش درج شده است. این تضمین می کند که کلمات string
و that
با هم اجرا نمی شوند.
مراقب بولین ها باشید
همانطور که در بالا اشاره شد، یکی از مهمترین چالشهای YAML مقادیر بولی است. روش های زیادی برای تعیین Boolean در YAML وجود دارد که برای رشته مورد نظر بسیار آسان است به عنوان یک بولی تفسیر شود.
یک مثال بدنام از این مشکل کد دو رقمی کشور است. اگر کشور شما ایالات متحده
یا بریتانیا
است، خوب است. اگر کشور شما نروژ است، کد کشوری که برای آن NO
است، دیگر رشته ای نیست—این یک بولی است که به نادرست
ارزیابی می شود!
در صورت امکان، عمداً با مقادیر بولی و رشتههای کوتاهتر که ممکن است به اشتباه بهعنوان بولی تعبیر شوند، صریح باشید. پیشوند کوتاه YAML برای Booleans !!bool
است.
مراقب چندین اشکال اکتال باشید
این یک مشکل غیرعادی است، اما ممکن است دردسرساز باشد. YAML 1.1 از نماد متفاوتی برای اعداد اکتالی نسبت به YAML 1.2 استفاده می کند. در YAML 1.1، اعداد اکتالی شبیه ۰۷۷۷
هستند. در YAML 1.2، همان اکتال به 0o777
تبدیل می شود. خیلی کمتر مبهم است.
Kubernetes، یکی از بزرگترین کاربران YAML، از YAML 1.1 استفاده می کند. اگر از YAML با سایر برنامههایی که از نسخه ۱.۲ مشخصات استفاده میکنند، استفاده میکنید، بسیار مراقب باشید که از نماد هشتگانه اشتباه استفاده نکنید. از آنجایی که octal این روزها به طور کلی فقط برای مجوزهای فایل استفاده می شود، در مقایسه با دیگر گوچاهای YAML یک مورد گوشه ای است. با این حال، YAML octal می تواند شما را گاز بگیرد اگر مراقب نباشید.
مراقب YAML قابل اجرا باشید
قابل اجرا YAML؟ آره. بسیاری از کتابخانه های YAML، مانند PyYAML برای Python، اجازه اجرای دستورات دلخواه را هنگام غیرسریال کردن YAML داده اند. به طرز شگفت انگیزی، این یک اشکال نیست، اما یک قابلیت YAML طراحی شده است تا اجازه دهد.
در مورد PyYAML، رفتار پیشفرض برای deserialization نهایتاً تغییر کرد تا فقط از زیرمجموعه ایمن YAML پشتیبانی کند که اجازه چنین کاری را نمیدهد. رفتار اصلی را می توان به صورت دستی بازیابی کرد (برای جزئیات بیشتر در مورد نحوه انجام این کار به پیوند بالا مراجعه کنید)، اما در صورت امکان باید از استفاده از این ویژگی اجتناب کنید و اگر قبلاً غیرفعال نشده است، آن را به طور پیش فرض غیرفعال کنید.
هنگام سریالسازی و سریالزدایی، مراقب ناهماهنگیها باشید
یکی دیگر از مشکلات احتمالی YAML این است که کتابخانههای مختلف YAML-handling در زبانهای برنامهنویسی مختلف گاهی نتایج متفاوتی ایجاد میکنند.
در نظر بگیرید: اگر یک فایل YAML دارید که شامل مقادیر بولی است که به صورت true
و false
نشان داده شده است، و آن را مجدداً با استفاده از کتابخانه دیگری که نشاندهنده boolean است در YAML سریال میکنید. به عنوان y
و n
یا روشن
و خاموش
، میتوانید نتایج غیرمنتظرهای دریافت کنید. حتی اگر کد از نظر عملکردی یکسان باقی بماند، ممکن است کاملاً متفاوت به نظر برسد.
از YAML استفاده نکنید
کلی ترین راه برای جلوگیری از مشکلات YAML؟ از آن استفاده نکنید. یا حداقل، مستقیماً از آن استفاده نکنید.
اگر باید YAML را به عنوان بخشی از یک فرآیند پیکربندی بنویسید، میتوانید کد را در JSON یا کد بومی (مثلاً دیکشنریهای پایتون) بنویسید، سپس آن را به صورت سریالی در YAML بنویسید. کنترل بیشتری روی انواع اشیا خواهید داشت و با استفاده از زبانی که قبلاً با آن کار میکنید، راحتتر خواهید بود.
در صورت عدم موفقیت، میتوانید از یک لنگر مانند yamllint برای بررسی مشکلات رایج YAML استفاده کنید. . به عنوان مثال، میتوانید مقادیر درستی مانند YES
یا off
را به نفع true
و false
و یا برای اجرای نقل قول رشته.
پست های مرتبط
۷ YAML گوچا که باید اجتناب کرد – و چگونه از آنها اجتناب کنید
۷ YAML گوچا که باید اجتناب کرد – و چگونه از آنها اجتناب کنید
۷ YAML گوچا که باید اجتناب کرد – و چگونه از آنها اجتناب کنید