رژیم دیسکی Rust در Nightly، مرز تازهای برای آرتیفکتهای ساخت را میآزماید
Cargo در حال آزمایش پیشفرضی در شاخه nightly است که متادیتای تکراری را از فایلهای `.rlib` حذف میکند؛ تغییری که میتواند پوشههای target را کوچکتر کند، اما مرز دقیقتری برای فرایندهای لینک دستی میسازد.

آزمایش تازه در سامانهٔ ساخت Rust یک دردسر آشنای توسعهدهندگان را هدف گرفته است: اندازهٔ پوشهٔ target. تیم Cargo در ۱۸ اوت اعلام کرد که Cargo و rustc در شاخهٔ nightly بهزودی بهطور پیشفرض از -Zembed-metadata=no استفاده میکنند؛ تنظیمی که برای کاهش متادیتای تکراری در آرتیفکتهای کتابخانهای کامپایلشده طراحی شده است.
این تغییر دامنهای محدود دارد. در کامپایل خط لولهای، Rust میتواند فایل .rmeta را زودتر تولید کند تا کامپایل crateهای وابسته آغاز شود. پس از پایان کامپایل کتابخانه، فایل .rlib نیز بهطور سنتی هم کد اجرایی و هم متادیتای Rust را در خود دارد؛ بنابراین متادیتای مرتبط دو بار روی دیسک ذخیره میشود. با -Zembed-metadata=no، کامپایلر دیگر متادیتا را داخل .rlib قرار نمیدهد و مصرف دیسک کاهش مییابد.
میزان کاهش به پروفایل ساخت وابسته است. در آزمایش تیم Cargo، ساخت release برای serde از ۴۰٫۸۸ به ۲۸٫۶۸ مگابایت رسید؛ یعنی ۲۹٫۸ درصد کاهش. ساخت release خود Cargo نیز از ۸۰۷٫۰۵ به ۵۳۷٫۱۵ مگابایت رسید؛ یعنی ۳۳٫۴ درصد کاهش. ساختهای توسعهٔ پیشفرض سود کمتری داشتند، چون آرتیفکتهای incremental و اطلاعات دیباگ بخش بزرگتری از فضای آنها را مصرف میکنند.
بنابراین این فقط یک کلید صرفهجویی در فضای دیسک برای اپراتورهای CI نیست. آزمایش بررسی میکند آیا Rust میتواند آرتیفکت لازم برای لینک نهایی را از متادیتای لازم برای کامپایل جدا کند، بدون آنکه فرضهای موجود را درهم بشکند. بیشتر کاربران Cargo فقط پوشهٔ target کوچکتری خواهند دید، اما پروژههایی که فایلهای .rlib را بهصورت دستی لینک میکنند ممکن است لازم باشد فایل .rmeta متناظر را نیز با --extern در اختیار کامپایلر بگذارند. Cargo در حال حاضر این .rmeta را به پوشهٔ نهایی target/<profile> منتقل نمیکند؛ در نتیجه ابزارها ممکن است مجبور شوند محل آن را از خروجی JSON ساخت Cargo پیدا کنند.
رویکرد امنیتی و سازگاری عمداً محتاطانه است. این یک آزمایش در nightly است، نه قابلیتی پایدار یا وعدهای برای تثبیت. تیم Cargo پیش از تصمیمگیری دربارهٔ تثبیت، تغییر یا کنار گذاشتن این مسیر، گزارشهای کاربران را جمعآوری میکند. بنابراین تیمهایی که nightly را آزمایش میکنند باید آن را یک تمرین سازگاری بدانند: ساختهای clean و incremental را مقایسه کنند، زنجیرههای لینک سفارشی را بررسی کنند و امکان بازگشت را نگه دارند؛ از طریق -Zembed-metadata=yes، متغیر CARGO_UNSTABLE_EMBED_METADATA=true یا تنظیم متناظر Cargo.
درس گستردهتر این است که کارایی ساخت، مسئلهای دربارهٔ طراحی آرتیفکتها نیز هست. آزمایش Rust میتواند در ساختهای release که متادیتای زیادی دارند فضای قابلتوجهی آزاد کند، اما موفقیت آن به این بستگی دارد که ابزارهای ساخت جریان اطلاعات مورد نیاز کامپایل خط لولهای و لینک دستی را حفظ کنند. این تغییر یک آزمایش nightly است، هنوز برای تثبیت برنامهریزی نشده و ممکن است بر فرایندهایی که .rlib را دستی لینک میکنند اثر بگذارد.
خبرخوان را در ایمیل بگیرید
هر سیگنال تازه، مستقیم از خط تولید. بدون مزاحمت، لغو عضویت در هر زمان.


