يتعامل Discourse مع خطافات git باستخدام lefthook، ويعتمد على bin/lint كنقطة دخول رئيسية لسطر الأوامر لتشغيل نفس الفحوصات يدوياً.
إذا كنت تعمل في نسخة محلية (clone)، قم بتثبيت الخطافات مرة واحدة:
pnpm install
pnpm lefthook install
بعد ذلك، سيتم فحص الملفات المُجهَّزة (staged) تلقائياً عند تنفيذ git commit.
الأمر الرئيسي: bin/lint
استخدم bin/lint عندما تريد تشغيل أدوات الفحص (linters) المُهيأة في المستودع بنفسك بدلاً من الانتظار حتى خطاف ما قبل التثبيت (pre-commit hook).
أمثلة شائعة:
bin/lint
bin/lint path/to/file.rb path/to/file.gjs
bin/lint --recent
bin/lint --staged
bin/lint --unstaged
bin/lint --wip
bin/lint --fix path/to/file.rb
bin/lint --fix --recent
bin/lint --fix
ما يفعله كل وضع
bin/lint: يفحص جميع الملفات المدعومة في المستودعbin/lint path/to/file ...: يفحص الملفات المحددة فقطbin/lint --recent: يفحص الملفات التي تم تغييرها في آخر 50 عملية تثبيت، بالإضافة إلى الملفات غير المتتبَّعة (untracked)bin/lint --staged: يفحص الملفات المُجهَّزة (staged) فقطbin/lint --unstaged: يفحص الملفات غير المُجهَّزة (unstaged) فقطbin/lint --wip: يفحص الملفات المُجهَّزة، والملفات غير المُجهَّزة، والملفات التي تم تغييرها منذ فرعmainbin/lint --fix ...: يشغّل أدوات الإصلاح التلقائي للملفات المحددةbin/lint --fix: يشغّل جميع أدوات الإصلاح التلقائي المتاحة عبر المستودع بأكملهbin/lint --verbose: يطبع أوامر lefthook الأساسية
عند تمرير ملفات صريحة، يقوم bin/lint بتصفيتها إلى أنواع الملفات القابلة للفحص المدعومة قبل استدعاء lefthook.
ملفات توثيق Markdown ليست حالياً جزءاً من
bin/lint، لذا فإن تشغيلbin/lint path/to/doc.mdسيُبلغك بأنه لا توجد ملفات مطابقة للفحص.
ما الذي يتم فحصه
توجد الإعدادات الدقيقة في lefthook.yml. عند كتابة هذا الدليل، يغطي bin/lint ما يلي:
Ruby
**/*.{rb,rake,thor}- سكربتات Ruby تحت
bin/**/* Gemfile
الفحوصات:
rubocopsyntax_tree(stree check)
تنسيق JavaScript، GJS، CSS، و SCSS
app/assets/stylesheets/**/*.{css,scss}frontend/**/*.{js,gjs,scss,css,cjs,mjs}- ملفات الأصول المطابقة للإضافات (plugins) والسمات (themes)
الفحوصات:
prettier/pprettier
فحص JavaScript و GJS
frontend/**/*.{js,gjs}- ملفات JS المطابقة للإضافات والسمات
الفحوصات:
eslint(مع قواعدtemplate-*منeslint-plugin-emberالتي تغطي الجزء الخاص بالقوالب في ملفات.gjs)
فحص SCSS
app/assets/stylesheets/**/*.scss- ملفات SCSS المطابقة للإضافات والسمات
الفحوصات:
stylelint
فحوصات YAML والترجمة (locale)
**/*.{yaml,yml}باستثناءconfig/database.yml**/{client,server}.en.yml
الفحوصات:
yaml-lintscript/i18n_lint.rb
فحص الأنواع (Type checking)
عند تشغيل bin/lint دون تمرير أي حجة ملف، يشغّل فحص المستودع الكامل أيضاً:
pnpm lint:types
هذا هو فحص بأسلوب Glint/TypeScript لمعلومات أنواع JavaScript في Discourse.
أوامر
bin/lint path/to/fileوخطاف ما قبل التثبيت (pre-commit hook) لا تشغّل فحص الأنواع الكامل. استخدمbin/lintالعادي عندما تريد إجراء فحص شامل للمستودع بأكمله.
ما الذي يمكن إصلاحه تلقائياً
يمكن لـ bin/lint --fix إصلاح الكثير من المشكلات تلقائياً، لكن ليس جميعها.
تم تكوين الإصلاح التلقائي لـ:
prettier --writeeslint --fixstylelint --fixrubocop -Asyntax_tree(stree write)
عملياً، هذا يعني أن --fix يمكنه إعادة تنسيق وكتابة:
- Ruby
- JavaScript / GJS
- CSS / SCSS
هذه الفحوصات لا يتم إصلاحها تلقائياً بواسطة bin/lint --fix:
- التحقق من صحة صياغة YAML
- فحص الترجمة (i18n linting) لـ
client.en.yml/server.en.yml - فحص الأنواع (Glint/type checking)
العلاقة مع خطافات git
يستخدم خطاف ما قبل التثبيت (pre-commit hook) نفس إعداد lefthook المستخدم في bin/lint، لكنه يعمل فقط على الملفات المُجهَّزة (staged).
هذا يعني:
- قد يفشل التثبيت (commit) لأن الملفات المُجهَّزة لا تجتاز الفحص
bin/lint --stagedهو المقابل اليدوي الأقرب لخطاف ما قبل التثبيتbin/lint --fix --stagedطريقة جيدة لإصلاح بالضبط ما أنت على وشك تثبيته
سير عمل عملي
للتنمية اليومية، هذه هي الأوامر الأكثر فائدة:
# قبل تثبيت بضعة ملفات معدلة
bin/lint --fix path/to/file1.rb path/to/file2.gjs
# للتحقق من بالضبط ما سيفحصه خطاف ما قبل التثبيت
bin/lint --staged
# لتنظيف جميع الأعمال الجارية حالياً
bin/lint --fix --wip
# لتشغيل مجموعة فحص المستودع الكاملة، بما في ذلك فحوصات الأنواع
bin/lint
هذا المستند مُتحكم به عبر الإصدارات - اقترح تعديلات على github.