«Cargo install» موجود، لكن «cargo update» غير موجود؟ ألم مألوف لكل مطور Rust
\n\nلقد قمت للتو بتشغيل cargo install ripgrep للحصول على ملف ثنائي جديد rg. مر أسبوع. تسمع أنه تم إصدار إصدار جديد — 14.1.0 بدلاً من 13.0.0. وهنا يطرح سؤال منطقي: «هل يحتوي cargo install على أمر تحديث مكافئ؟»
هذا السؤال حصد آلاف المشاهدات على Stack Overflow. وليس من دون سبب. الأمر هو أنه لا يوجد في cargo أمر مدمج cargo install update. لا، لم تصب بالعمى. بالفعل لا يوجد. لكن هذا لا يعني أنك محكوم عليك بتنزيل الإصدارات الجديدة يدويًا. هناك عدة طرق، وسنشرحها جميعًا — من البسيطة إلى الأنيقة.
في هذه المقالة، لن نترجم الإجابة من Stack Overflow فقط. بل سنقارن بين الأساليب، ونعرض كودًا حقيقيًا، ونقدم نصائح قابلة للتنفيذ. هيا بنا!
\n\nلماذا لا يوجد أمر «update» في Cargo للصناديق المثبتة؟
\n\nقبل أن نبدأ في البحث عن الأخطاء، دعنا نفهم الفلسفة. cargo install مصمم لتثبيت صناديق الباينري (تلك التي تحتوي على قسم [[bin]] في ملف Cargo.toml الخاص بها). هذا ليس مدير حزم على غرار apt أو npm. Cargo هو في المقام الأول أداة بناء ومدير تبعيات للمشاريع، وليس مثبت برامج عالمي.
أمر cargo update موجود، لكنه يعمل داخل المشروع — يقوم بتحديث التبعيات في ملف Cargo.lock. بالنسبة للملفات الثنائية المثبتة عالميًا، هناك حاجة إلى حل آخر.
الطريقة رقم 1: إعادة التثبيت الكلاسيكية (cargo install --force)
\n\nالطريقة الأبسط والأكثر وضوحًا هي إعادة تثبيت الصندوق باستخدام العلم --force:
# التثبيت الأول\ncargo install ripgrep\n\n# بعد أسبوع — التحديث\ncargo install --force ripgrep\n\n\nماذا يحدث تحت الغطاء؟ يقوم Cargo بتنزيل أحدث إصدار من الصندوق من crates.io، ويعيد بنائه، ويستبدل الملف الثنائي. العلم --force يجبر على استبدال الملف الموجود، حتى لو كان الإصدار هو نفسه.
الإيجابيات:
\n- \n
- لا يتطلب تثبيت أدوات إضافية \n
- يعمل دائمًا وفي كل مكان \n
- بديهي وسهل الفهم \n
السلبيات:
\n- \n
- في كل مرة إعادة ترجمة كاملة (تستغرق وقتًا طويلاً إذا كان الصندوق كبيرًا) \n
- لا يوجد تحقق مما إذا كان قد تم إصدار إصدار جديد — أنت فقط تعيد التثبيت \n
- غير مريح إذا كان لديك 10+ صناديق مثبتة \n
هذا يشبه إعادة تثبيت Windows لتحديث برنامج تشغيل. هل يعمل؟ نعم. هل هو الأمثل؟ لا.
\n\nالطريقة رقم 2: cargo-outdated — كاشف ذكي للصناديق القديمة
\n\nإذا كنت تريد التأكد من أن التحديث ضروري، فقم بتثبيت cargo-outdated:
cargo install cargo-outdated\n\n\nالآن تحقق من الصناديق القديمة:
\n\ncargo outdated --root ~/.cargo\n\n\nسيظهر الإخراج شيئًا مثل:
\n\nPackage Current Latest Deps\nripgrep 13.0.0 14.1.0 -\nbat 0.22.1 0.23.0 -\n\n\nثم يمكنك تحديث صندوق معين عبر cargo install --force. لكن هذه لا تزال خطوتين. هل تريد أتمتة؟ تابع القراءة.
الإيجابيات:
\n- \n
- يظهر فقط الصناديق القديمة حقًا \n
- يعمل أيضًا مع تبعيات المشروع \n
- يحتوي على خيارات للتصفية \n
السلبيات:
\n- \n
- لا يقوم بالتحديث بنفسه — فقط يخطر \n
- يتطلب تثبيتًا منفصلاً \n
الطريقة رقم 3: cargo-update (نعم، يوجد مثل هذا الصندوق!)
\n\nالإجابة الأكثر أناقة على سؤال «هل يحتوي cargo install على أمر تحديث مكافئ؟» هي