يستخدم Discourse أداة lefthook للخطافات (hooks) الخاصة بـ git، ويستخدم 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 عملية تثبيت (commits)، بالإضافة إلى الملفات غير المتتبَّعة (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 فقط تحت مجلد
docs/developer-guides/. إذا قمت بتشغيلbin/lint path/to/doc.mdعلى أي ملف Markdown آخر، فسيُبلّغك النظام بأنه لم يتم فحص أي شيء.
ما الذي يتم فحصه
توجد التهيئة الدقيقة في 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 لمعلومات الأنواع في Discourse. يعمل في وضع TypeScript strict وينشئ أيضًا التصريحات المنشورة (published declarations).
لا يشغّل
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).
هذا يعني:
- قد تفشل عملية التثبيت لأن الملفات المُدرجة لا تجتاز الفحص
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.