تخطَّ إلى المحتوى

tool directive

تتبّع أدوات المشروع داخل go.mod tool directive

منذ Go 1.24، يمكن تسجيل تبعية أداة قابلة للتنفيذ (linter، مولّد كود...) داخل go.mod عبر توجيه tool، فتُتبَّع بإصدار محدَّد دون الحاجة لملف tools.go الوهمي القديم.

قبل Go 1.24، تتبُّع أداة كتبعية (مثل مولّد كود يُشغَّل بـ go run أو go install) كان يحتاج حيلة شائعة: ملف tools.go بعلامة بناء تستثنيه من الترجمة العادية، يحتوي استيرادًا فارغًا (blank import) بـ _ فقط لإجبار go.sum على تتبّع إصدار الأداة. توجيه tool الجديد يلغي هذه الحيلة كليًا: سطر tool داخل go.mod يسجّل الأداة كتبعية بإصدار محدَّد مباشرة، بلا أي كود وهمي.

الإضافة تتم عبر go get -tool، وتشغيل الأداة المسجَّلة عبر go tool، فتضمن أن كل من يبني المشروع يستخدم بالضبط نفس إصدار الأداة المثبَّت بـ go.sum.

الصياغة

tool module/path/cmd/toolname

go get -tool module/path/cmd/toolname@version
go tool toolname [args...]

📄 مثال

// go.mod
module github.com/user/myapp

go 1.24

tool golang.org/x/tools/cmd/stringer

require (
  golang.org/x/tools v0.30.0 // indirect
)

أهم النقاط

العنصرالوظيفة
tool pathسطر داخل go.mod يسجّل أداة كتبعية بإصدار محدَّد، بلا استيراد وهمي بالكود
go get -tool path@versionيضيف السطر تلقائيًا لـ go.mod ويحدّث go.sum
go tool nameيشغّل الأداة المسجَّلة بإصدارها الدقيق المحدَّد في go.mod

💡 نصائح عملية

  • احذف ملف tools.go القديم (الاستيراد الوهمي بـ _) بعد الانتقال لتوجيه tool — لم يعد له داعٍ
  • استخدم go get -tool path@none لإزالة أداة من go.mod بدل حذف السطر يدويًا

⚠️ أخطاء شائعة

  • إبقاء نمط tools.go القديم بجانب توجيهات tool الجديدة — يسبّب ازدواجية غير ضرورية بإدارة نفس التبعية
  • تثبيت أداة عالميًا بـ go install بدل تسجيلها بـ tool داخل go.mod — يفقد الفريق ضمان استخدام نفس إصدار الأداة بكل جهاز

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار GO الكامل بالعربي.