این صفحه هرمتیکی، مزایای استفاده از ساختهای هرمتیک و استراتژیهایی برای شناسایی رفتار غیرهرمتیک در ساختهای شما را پوشش میدهد.
بررسی اجمالی
هنگامی که کد منبع ورودی و پیکربندی محصول یکسان داده می شود، یک سیستم ساخت هرمتیک همیشه همان خروجی را با جداسازی ساخت از تغییرات در سیستم میزبان برمی گرداند.
به منظور جداسازی ساخت، ساختهای هرمتیک به کتابخانهها و سایر نرمافزارهای نصب شده روی دستگاه میزبان محلی یا راه دور حساس نیستند. آنها به نسخه های خاصی از ابزارهای ساخت مانند کامپایلرها و وابستگی ها مانند کتابخانه ها بستگی دارند. این باعث می شود که فرآیند ساخت مستقل باشد زیرا به خدمات خارج از محیط ساخت متکی نیست.
دو جنبه مهم هرمسیتی عبارتند از:
- جداسازی : سیستم های ساخت هرمتیک ابزارها را به عنوان کد منبع در نظر می گیرند. آنها نسخه هایی از ابزارها را دانلود می کنند و ذخیره سازی آنها را مدیریت می کنند و از درختان فایل مدیریت شده استفاده می کنند. این باعث ایجاد انزوا بین ماشین میزبان و کاربر محلی، از جمله نسخه های نصب شده زبان ها می شود.
- هویت منبع : سیستمهای ساخت هرمتیک سعی میکنند از یکسانی ورودیها اطمینان حاصل کنند. مخازن کد، مانند Git، مجموعه ای از جهش های کد را با یک کد هش منحصر به فرد شناسایی می کنند. سیستمهای ساخت هرمتیک از این هش برای شناسایی تغییرات در ورودی ساخت استفاده میکنند.
فواید
مهمترین مزایای ساختمانهای هرمتیک عبارتند از:
- سرعت : خروجی یک اقدام را می توان در کش ذخیره کرد و نیازی به اجرای مجدد آن نیست مگر اینکه ورودی ها تغییر کنند.
- اجرای موازی : برای ورودی و خروجی داده شده، سیستم ساخت می تواند نموداری از تمام اقدامات برای محاسبه اجرای کارآمد و موازی بسازد. سیستم ساخت، قوانین را بارگذاری می کند و یک نمودار عمل و ورودی های هش را برای جستجو در حافظه پنهان محاسبه می کند.
- ساختهای چندگانه : میتوانید چندین بیلد هرمتیک را روی یک دستگاه بسازید که هر بیلد از ابزارها و نسخههای متفاوتی استفاده میکند.
- تکرارپذیری : ساختهای هرمتیک برای عیبیابی خوب هستند، زیرا شرایط دقیقی را که ساخت را ایجاد کردهاند، میدانید.
تشخیص عدم هرمتیک
اگر در حال آماده شدن برای تغییر به Bazel هستید، اگر از قبل هرمتیکی ساختهای موجود خود را بهبود ببخشید، مهاجرت آسانتر میشود. برخی از منابع رایج عدم هرمتیک در ساختمان ها عبارتند از:
- پردازش خودسرانه در فایل های
.mk
- اقدامات یا ابزارهایی که فایلها را بهطور غیر قطعی ایجاد میکنند، معمولاً شامل شناسههای ساخت یا مُهرهای زمانی هستند.
- باینریهای سیستمی که در میزبانها متفاوت هستند (مانند باینریهای
/usr/bin
، مسیرهای مطلق، کامپایلرهای C++ سیستم برای پیکربندی خودکار قوانین C++) - نوشتن روی درخت منبع در طول ساخت. این امر از استفاده از همان درخت منبع برای هدف دیگر جلوگیری می کند. اولین ساخت به درخت منبع می نویسد، درخت منبع را برای هدف A ثابت می کند. سپس تلاش برای ساختن هدف B ممکن است شکست بخورد.
عیب یابی سازه های غیر هرمتیک
با شروع اجرای محلی، مسائلی که بر بازدیدهای حافظه پنهان محلی تأثیر میگذارند، اقدامات غیرهرمتیک را نشان میدهند.
- از ساختهای متوالی تهی اطمینان حاصل کنید: اگر
make
اجرا کنید و ساخت موفقی داشته باشید، اجرای دوباره بیلد نباید هیچ هدفی را بازسازی کند. اگر هر مرحله ساخت را دو بار یا در سیستم های مختلف اجرا کنید، هش محتویات فایل را مقایسه کنید و نتایج متفاوتی دریافت کنید، ساخت قابل تکرار نیست. - مراحل را برای اشکال زدایی بازدیدهای حافظه نهان محلی از انواع ماشین های مشتری بالقوه اجرا کنید تا اطمینان حاصل کنید که مواردی از نشت محیط کلاینت به عملکردها را مشاهده می کنید.
- یک بیلد را در یک کانتینر docker اجرا کنید که حاوی چیزی جز درخت منبع بررسی شده و فهرست صریح ابزارهای میزبان نیست. خرابی های ساخت و پیام های خطا وابستگی های ضمنی سیستم را می گیرند.
- مشکلات هرمتیکی را با استفاده از قوانین اجرای از راه دور کشف و رفع کنید.
- Sandboxing سختگیرانه را در سطح هر عمل فعال کنید، زیرا اقدامات در یک ساخت می تواند حالتی باشد و بر ساخت یا خروجی تأثیر بگذارد.
- قوانین فضای کاری به توسعه دهندگان این امکان را می دهد که وابستگی هایی را به فضاهای کاری خارجی اضافه کنند، اما آنقدر غنی هستند که امکان انجام پردازش دلخواه را در این فرآیند فراهم کنند. با افزودن پرچم
--experimental_workspace_rules_log_file= PATH
به دستور Bazel خود می توانید گزارشی از برخی از اقدامات بالقوه غیر هرمتیک در قوانین فضای کاری Bazel دریافت کنید.
هرمسیتی با بازل
برای اطلاعات بیشتر در مورد اینکه چگونه پروژه های دیگر با استفاده از ساخت های هرمتیک با Bazel موفقیت آمیز بوده اند، به این گفتگوهای BazelCon مراجعه کنید:
- ساخت سیستم های بلادرنگ با Bazel (SpaceX)
- Bazel Remote Execution و Remote Caching (Uber و TwoSigma)
- ساخت سریعتر با اجرا و ذخیره از راه دور
- Fusing Bazel: Faster Incremental Builds
- اجرای از راه دور در مقابل اجرای محلی
- بهبود قابلیت استفاده از حافظه پنهان از راه دور (IBM)
- ساخت خودروهای خودران با Bazel (BMW)
- ساخت خودروهای خودران با Bazel + پرسش و پاسخ (GM Cruise)