ما هو golangci-lint ولماذا تحتاجه؟
golangci-lint ليس مجرد مكتبة عادية، بل هو أداة تجميع قوية لأدوات التحليل الثابت (linters) في لغة البرمجة Go. إنها أداة موحدة تقوم بتشغيل العديد من أدوات التحليل الثابت الشهيرة في وقت واحد، وتجمع نتائجها في تقرير واحد واضح. باختصار، هي "أداة linting للأدوات الأخرى".
لماذا تحتاجها؟ في تطوير Go الحديث، الحفاظ على جودة الكود هي مهمة بالغة الأهمية. أدوات linting المنفصلة مثل vet و staticcheck و errcheck و gocyclo وعشرات الأدوات الأخرى، ولكل منها إعداداته الخاصة، يمكن أن تحول إعداد CI/CD إلى كابوس. golangci-lint يحل هذه المشكلة من خلال توفير:
- نقطة دخول موحدة: أمر واحد يشغل جميع أدوات linting التي قمت بإعدادها.
- تشغيل متوازي: يتم تشغيل أدوات linting بالتوازي، مما يسرع عملية التحليل بشكل كبير.
- التخزين المؤقت: يتم تخزين النتائج مؤقتًا، مما يجعل عمليات التشغيل المتكررة (مثل تغيير ملف واحد فقط) شبه فورية.
- إعدادات مرنة: سهولة تفعيل/تعطيل أدوات linting، وتعديل سلوكها من خلال ملف YAML أو وسائط سطر الأوامر.
- التكامل مع بيئات التطوير و CI/CD: مدعوم من معظم بيئات التطوير الحديثة (VS Code, GoLand) وأنظمة التكامل المستمر (GitHub Actions, GitLab CI, Jenkins).
استخدام golangci-lint يساعد الفرق على اكتشاف الأخطاء المحتملة، والمشاكل الأسلوبية، والكود غير المستخدم، ومشاكل الأداء والأمان تلقائيًا في المراحل المبكرة من التطوير، مما يؤدي إلى كود أكثر موثوقية وقابلية للصيانة.
تثبيت golangci-lint
على عكس مكتبات Go العادية، يتم تثبيت golangci-lint كملف تنفيذي ثنائي، وليس استيراده في الكود. هناك عدة طرق للتثبيت:
1. التثبيت السريع (موصى به لـ CI/CD)
الطريقة الأسهل والأكثر تفضيلاً هي استخدام سكريبت التثبيت:
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.59.1
ملاحظة: استبدل v1.59.1 بأحدث إصدار من GitHub Releases.
2. التثبيت عبر go install
إذا كان لديك Go الإصدار 1.21 أو أحدث:
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
3. التثبيت عبر مديري الحزم (macOS/Linux)
macOS (Homebrew):
brew install golangci-lint
Linux (Snap):
sudo snap install golangci-lint --classic
4. التحقق من التثبيت
بعد التثبيت، تحقق من أن كل شيء يعمل:
golangci-lint --version
يجب أن ترى شيئًا مثل: golangci-lint has version 1.59.1 built from ...
بداية سريعة مع مثال كود
لنقم بإنشاء مشروع Go بسيط وتشغيل golangci-lint عليه.
الخطوة 1: إنشاء المشروع
mkdir my-lint-project
cd my-lint-project
go mod init my-lint-project
الخطوة 2: كتابة كود "سيء"
قم بإنشاء ملف main.go:
package main
import (
"fmt"
"io/ioutil" // deprecated
"log"
)
var unusedGlobalVar = 42 // متغير غير مستخدم
func main() {
x := 10 // متغير غير مستخدم
fmt.Println("Hello")
readFile("test.txt")
}
func readFile(path string) {
data, err := ioutil.ReadFile(path) // الخطأ لم يتم التعامل معه
if err != nil {
log.Fatal(err)
}
_ = data
}