golangci-lint: أداة تجميع المدققات للغة Go
1. ما هي ولماذا تحتاجها
golangci-lint هي أداة قوية لتجميع المدققات (linters) للغة Go، والتي تدمج العشرات من أدوات تحليل الكود الثابت الشائعة في واجهة واحدة سريعة وقابلة للتخصيص. بدلاً من تثبيت وتشغيل كل مدقق على حدة (مثل vet، staticcheck، errcheck، gocyclo وغيرها)، يحصل المطور على أمر واحد يقوم بتشغيلها جميعًا بالتوازي، ويخزن النتائج مؤقتًا، ويقدم تقريرًا موحدًا. هذا يوفر ساعات من إعداد CI/CD والتطوير المحلي.
لماذا تحتاجها؟ في المشاريع الكبيرة بلغة Go (الخدمات المصغرة، أدوات CLI، خوادم الويب)، من المستحيل الحفاظ على جودة الكود يدويًا. الأخطاء مثل الأخطاء غير المعالجة، المتغيرات غير المستخدمة، التنسيق الخاطئ، أو حالات التوقف التام (deadlocks) المحتملة يمكن أن تؤدي إلى أخطاء في بيئة الإنتاج. golangci-lint تكتشف هذه المشكلات تلقائيًا في مرحلة مراجعة الكود أو قبل الالتزام (pre-commit). كما تساعد في الحفاظ على نمط كود موحد في الفريق، وهو أمر بالغ الأهمية لسهولة القراءة والصيانة.
المزايا الرئيسية مقارنة بتشغيل المدققات بشكل منفصل: السرعة (تعمل المدققات بالتوازي، ويتم تخزين النتائج مؤقتًا)، المرونة (يمكنك تفعيل/تعطيل أي مدقق، وضبط قواعده عبر ملف YAML)، التكامل (يعمل مع بيئات التطوير المتكاملة IDE، وأنظمة CI/CD، ويدعم go vet بشكل افتراضي)، وتنسيق إخراج موحد (JSON، SARIF، نص ملون - لأي أداة).
2. التثبيت
يمكن تثبيت golangci-lint بعدة طرق. الطريقة الموصى بها هي عبر go install (يتطلب Go 1.18+):
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
بعد التثبيت، سيكون الملف التنفيذي متاحًا في $GOPATH/bin (عادةً ~/go/bin). تحقق من التثبيت:
golangci-lint --version
طرق بديلة (لـ CI/CD أو إذا لم يكن Go مثبتًا):
- Linux/macOS (curl):
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.55.2 - macOS (Homebrew):
brew install golangci-lint - Docker:
docker run --rm -v $(pwd):/app -w /app golangci/golangci-lint:v1.55.2 golangci-lint run -v
3. بداية سريعة — مثال عملي بسيط
أنشئ وحدة Go جديدة وملفًا يحتوي على خطأ متعمد:
mkdir myproject && cd myproject
go mod init myproject
أنشئ ملفًا باسم main.go:
package main
import "fmt"
func main() {
x := 10
fmt.Println("Hello")
// خطأ: متغير x غير مستخدم
}
قم بتشغيل المدقق:
golangci-lint run
سيكون الإخراج مشابهًا لما يلي:
main.go:6:2: `x` is unused (deadcode)
x := 10
^
وجد المدقق متغيرًا غير مستخدم. قم بتصحيح الكود (احذف السطر x := 10) وأعد التشغيل — لن تظهر أي أخطاء.
للحصول على فحص أكثر صرامة، استخدم العلم -v (مفصل) و --fast (المدققات السريعة فقط):
golangci-lint run -v --fast
4. الأوامر والوظائف الأساسية
على عكس المكتبات، golangci-lint هي أداة CLI. "وظائفها" هي أوامر وخيارات. دعنا نستعرض 8 أوامر وخيارات رئيسية.
4.1. run — التشغيل الأساسي للمدققات
الصيغة: golangci-lint run [خيارات] [مسار]
الوظيفة: