دروس الوحدة (5/5)
بناء القيود والعلامات
قيود البناء (وتسمى أيضًا علامات البناء) بوابة تجميع الملف استنادًا إلى نظام التشغيل أو البنية أو إصدار Go أو العلامات المخصصة التي تم تمريرها في سطر الأوامر. يتم استخدامها للتعليمات البرمجية عبر الأنظمة الأساسية، واختيار ملفات الاختبار الثقيلة، والسيناريوهات المماثلة.
بناء الجملة الحديث: //go:build
منذ Go 1.17+، التنسيق الأساسي هو التعليق الخاص //go:build، الموضوع في أعلى الملف قبل package، على سطر بمفرده، متبوعًا بسطر فارغ:
//go:build linux
package main
// this file is built ONLY on Linuxثلاث قواعد مطلقة:
- يجب أن يظهر التعليق قبل
package. - يجب أن يتبعه سطر فارغ.
- لا توجد مسافة بين
//وgo:build(إنه مشغل نحوي، وليس مجرد أي تعليق).
التعبيرات المنطقية
التعبير بعد //go:build يقبل العوامل المنطقية:
//go:build linux && amd64 // both conditions
//go:build linux || darwin // any one (Unix-like)
//go:build !windows // negation
//go:build (linux || darwin) && !arm64
//go:build go1.22 // Go version ≥ 1.22
//go:build integration // custom tag (see below)العلامات المضمنة الأكثر شيوعًا:
- نظام التشغيل:
linux,darwin,windows,freebsd,js... - الهندسة المعمارية:
amd64,arm64,386,wasm... - إصدار Go:
go1.20،go1.22... (صحيح إذا كان الإصدار هو ≥). cgo: صحيح إذا تم تمكين cgo.
عبر الأنظمة الأساسية: اصطلاح اسم الملف
بعيدًا عن العلامات الصريحة، يتعرف Go على لاحقات أسماء الملفات باعتبارها قيود بناء ضمنية:
db_linux.go // linux only
db_windows.go // windows only
db_linux_amd64.go // linux/amd64 only
إنه النمط الاصطلاحي للتطبيقات المعتمدة على النظام الأساسي لنفس الواجهة (يحدد كل ملف نفس الوظائف برمز مختلف).
العلامات المخصصة: اختيار الاختبارات الثقيلة
العلامات المخصصة هي أي معرف تمرره في سطر الأوامر:
//go:build integration
package mypkg
// tests that need a real DB, run only on demandتنفيذ:
go test -tags=integration ./...بدون -tags=integration، يكون الملف غير مرئي للمترجم (الاختبارات الموجودة بداخله غير موجودة لـ go test). إنها الطريقة الأساسية لفصل اختبارات الوحدة (دائمًا) عن اختبارات التكامل (عند الطلب، ربما في CI فقط).
بناء الجملة القديم: // +build (مهمل)
قبل 1.17 كان التنسيق // +build linux (لاحظ المسافة، وهو +build، وليس go:build). لا يزال مدعومًا للتوافق مع الإصدارات السابقة، ولكن gofmt في Go 1.17+ يضيف كلاهما عندما يعثر على الإصدار القديم فقط:
//go:build linux
// +build linux
package mainبالنسبة للملفات الجديدة، استخدم النموذج //go:build الحديث فقط.
تمارين
في الجزء العلوي من الملف، قم بإضافة قيد البناء الذي يجمعه فقط على نظام التشغيل Linux. تذكر السطر الفارغ قبل الحزمة.
إظهار التلميح
يتم وضع التعليق //go:build قبل الحزمة، على سطر بمفرده، متبوعًا بسطر فارغ.
الحل متاح بعد 3 من المحاولات
أضف قيد بناء يستثني Windows (استخدم عامل النفي!).
الحل متاح بعد 3 من المحاولات
لتمكين علامة "تكامل" مخصصة تم الإعلان عنها باستخدام //go:build التكامل في وقت الاختبار، ما العلامة التي تستخدمها؟
$ go test -tags=???