פתרון שחזור בנייה¶
נאסוף תחילה את כל קלטי הבנייה ולא רק את Cargo.lock. אם ההבדל נובע מנתיב debug, ננסה remap-path-prefix ונבדוק שה־debugger עדיין יכול למצוא מקור דרך mapping מתועד. אם ההבדל נובע מקובץ שנוצר בזמן build, נתקן את ה־generator כך שיקבל זמן קבוע או ישמיט מידע שאינו נחוץ.
ה־build.rs הבא הוא ניסוי שמדגים תלות סביבתית מפורשת. הוא מודיע ל־Cargo שעליו לרוץ מחדש כאשר הערך משתנה, ומעביר אותו לקוד דרך env! בזמן קומפילציה.
fn main() {
println!("cargo:rerun-if-env-changed=LAB_BUILD_LABEL");
let label = std::env::var("LAB_BUILD_LABEL").unwrap_or_else(|_| "unset".into());
println!("cargo:rustc-env=LAB_BUILD_LABEL={label}");
}
בתוכנית עצמה נדפיס env!("LAB_BUILD_LABEL"). שינוי הערך בין שתי בניות מסביר שינוי תוצר גם כאשר קוד המקור וה־lockfile זהים. במוצר נבטל את התלות או נוסיף אותה ל־manifest של הבנייה. הבדיקה במצב frozen צריכה להיכשל אם חסר מקור תלות, והחסימה הסביבתית של הרשת צריכה למנוע גם ניסיון עצמאי של build script לצאת החוצה.
ה־pinning קובע בסיס לשחזור ולא התחייבות להישאר עליו לנצח. תוכנית העדכון תכלול בדיקת advisory, שינוי מבוקר של lockfile, הרצת מטריצת הבדיקות ושמירת אפשרות לשחזר גם גרסה קודמת. חתימת artifact מאמתת את מקור החבילה לפי המפתח שנבחר, בעוד reproducibility מאפשרת להשוות בין בונים עצמאיים; אלו ראיות שונות.