مقدمة: عندما يتحول تجميع Rust إلى مهمة شاقة
\n\nقررت بناء Parity (أو أي مشروع Rust معقد آخر) من المصدر. تم تشغيل الأمر cargo build، والصمت يخيم على الطرفية، وبعد دقيقة ترى الرسالة المألوفة للكثيرين:
Blocking waiting for file lock on the registry index\n\nيتجمد البناء تمامًا. Ctrl+C لا ينفع، إعادة تشغيل الطرفية أيضًا لا تنفع. هل هذا مألوف؟ هذه المشكلة هي واحدة من أكثر المشكلات شيوعًا على Stack Overflow (آلاف المشاهدات)، واليوم سنقوم بتحليلها بالتفصيل.
\n\nفي هذه المقالة، سأشرح لكم، كمرشدكم في عالم Rust:
\n- لماذا يحدث هذا الخطأ؟
\n- كيف يمكن إصلاحه في 30 ثانية؟
\n- كيف نمنع حدوثه تمامًا؟
\n- وسنلقي نظرة خاطفة على ما وراء الكواليس في Cargo.
هيا بنا! 🚀
\n\nمن أين يأتي "Blocking waiting for file lock on the registry index"؟
\n\nأولاً، دعنا نترجم هذا الخطأ من لغة Cargo إلى لغة البشر:
\n\n"أنا، Cargo، أريد تنزيل أو تحديث قائمة الحزم من السجل (registry)، لكنني لا أستطيع — ملف القفل مشغول بالفعل بواسطة عملية أخرى. أنتظر..."
\n\nفي نظام Rust البيئي، يستخدم cargo أقفال الملفات (ملفات .lock) لمنع عمليتين من الكتابة في ذاكرة التخزين المؤقت للسجل (~/.cargo/registry) في نفس الوقت. هذا يحمي من تلف البيانات، لكن في بعض الأحيان "يعلق" القفل.
الأسباب الرئيسية للتجميد
\n- \n
- إنهاء غير طبيعي لبناء سابق — أغلقت الطرفية، أو انطفأ الكمبيوتر، أو تعطل
cargo buildمع خطأ، لكن ملف القفل بقي. \n - نسختان من Cargo في نفس المشروع — قمت بتشغيل البناء في نافذتي طرفية في نفس الوقت. \n
- بناء Parity من المصدر — هذا المشروع يسحب عددًا هائلاً من التبعيات (مئات الكريتات)، وقد يتعطل Cargo في مرحلة الفهرسة، خاصة على الأجهزة الضعيفة أو مع الإنترنت البطيء. \n
- مشاكل في صلاحيات الوصول — نادرًا، لكن يحدث عندما يكون
~/.cargoمملوكًا لمستخدم آخر. \n - نظام ملفات لا يدعم الأقفال — على سبيل المثال، بعض المشاركات الشبكية أو WSL بدون إعدادات صحيحة. \n
5 طرق للحل (من السريع إلى الموثوق)
\n\n🔧 الطريقة 1: قتل عملية Cargo (الأسرع)
\nإذا كنت متأكدًا من عدم وجود أي بناء آخر قيد التشغيل، فقط قم بإنهاء العملية التي تمسك القفل.
\n\nLinux/macOS:
\npkill cargo\n# أو بشكل أقوى:\nkillall -9 cargo\n\nWindows (PowerShell):
\nGet-Process cargo | Stop-Process -Force\n\nبعد ذلك، قم بتشغيل cargo build مرة أخرى. في 80% من الحالات، هذا يكفي.
🔧 الطريقة 2: حذف ملف القفل يدويًا
\nإذا لم تنجح الطريقة الأولى، انتقل إلى دليل السجل واحذف ملف القفل.
\n\nالمسار:
\n# Linux/macOS\nrm -f ~/.cargo/registry/.cache-lock\nrm -f ~/.cargo/registry/.package-cache\n\n# Windows (cmd)\ndel %USERPROFILE%\\.cargo\\registry\\.cache-lock\ndel %USERPROFILE%\\.cargo\\registry\\.package-cache\n\nبعد ذلك، سيقوم Cargo بإنشاء ملف قفل جديد عند التشغيل التالي. مهم: تأكد من عدم وجود عمليات Cargo أخرى قيد التشغيل، وإلا فإنك تخاطر بإتلاف ذاكرة التخزين المؤقت.
\n\n🔧 الطريقة 3: Cargo clean — الخيار النووي
\nإذا لم ينفع شيء، قم بتنظيف كل ما تراكم. هذا سيحذف مجلد target ويعيد تعيين ذاكرة التخزين المؤقت للتبعيات للمشروع الحالي. البناء التالي سيكون أطول، لكنه سيكون نظيفًا.
cargo clean\n\nبعد ذلك، حاول بناء المشروع مرة أخرى:
\ncargo build\n\nهذه الطريقة مفيدة بشكل خاص إذا كنت تبني Parity أو مشروعًا آخر بشجرة تبعيات ضخمة.