Tslint: طلب الميزة: السماح باستبعاد الملفات لقاعدة معينة

تم إنشاؤها على ٢٥ مارس ٢٠١٦  ·  14تعليقات  ·  مصدر: palantir/tslint

المشكلة

أرغب في استخدام قاعدة "class-name" لجميع ملفات TypeScript في مشروعي ، باستثناء ملف واحد يتم إنشاؤه.

تنسيق تكوين خيارات القواعد الحالية

بناء على الوثائق

يمكن أن تكون خيارات القاعدة إما قيمة منطقية صواب / خطأ تشير إلى ما إذا كانت القاعدة مستخدمة أم قائمة [منطقية ، ...] حيث يوفر المنطقي نفس الشيء كما في الحالة غير المدرجة في القائمة ، وبقية القائمة هي خيارات للقاعدة التي ستحدد ما الذي يبحث عنه

لذلك ، إذا كنت أرغب في تمكين قاعدة ما ، فلدي خياران فقط من حيث تنسيق خيارات القاعدة كما هو موضح هنا:

{
    "rules": {
        "class-name": true,
        "some-otherrule": [ true, arg1, arg2, arg3],
        ...
    }
}

لذا لا يسمح لي التنسيق الحالي بتمكين / تعطيل قاعدة معينة لبعض الملفات. إذا كنت أرغب في استبعاد ملف واحد من التحقق من عدم وجود أخطاء ، فحينئذٍ سأحتاج إلى استبعاد هذا الملف لجميع القواعد.

اقتراح تنسيق إضافي لتهيئة خيارات القواعد

للسماح باستثناء بعض الملفات ، تنسيق متقدم

قائمة [منطقية ، ...] حيث يوفر المنطقي نفس الشيء كما في الحالة غير القائمة
"some-otherrule": [ true, arg1, arg2, arg3],

يمكن تمديدها بحيث يمكن أن تكون الوسيطة الأولى إما منطقية (كما هي الآن) أو مصفوفة (أو ربما يكون الكائن أكثر وضوحًا مقارنة بالمصفوفة؟) التي تحدد الملفات المضمنة / المستبعدة.

أفكر في اتباع بناء الجملة:
"some-otherrule": [ [includeGlobPattern, excludeGlobPattern], arg1, arg2, arg3],
على سبيل المثال
"some-otherrule": [ ["**/*", "**/generated.ts"], arg1, arg2, arg3],
أو ربما إذا تم استخدام الكائن بدلاً من المصفوفة ، فسيكون بناء جملة follwogin أسهل:
"some-otherrule": [ {exclude: "**/generated.ts"}, arg1, arg2, arg3],
حيث ستكون خاصية التضمين افتراضيًا لجميع الملفات.

API Feature Request

التعليق الأكثر فائدة

لدي حالة استخدام مماثلة لـChowarmaan.

لدي ملفات اختبار *.test.ts أستخدم فيها تبعيات المطورين ، على سبيل المثال enzyme .
في tslint.json ، تم تمكين قاعدة no-implicit-dependencies وأريد تعطيل هذه القاعدة مقابل *.test.ts . ملفات الاختبار هذه ليست كلها في نفس المجلد ، لذا يتعين علي الآن وضع:

/* tslint:disable:no-implicit-dependencies */

في البداية على كل ملف اختبار وهو أمر مزعج

ال 14 كومينتر

لماذا لا تستخدم ببساطة:

/* tslint:disable:class-name */
// your generated file here

هل هذا لا يعمل؟

يمكن استخدام ذلك بالفعل لجعله يعمل ، لكني قمت بتقديم طلب الميزة هذا لتجنب تعديل مُنشئ TypeScript (أو إضافة تعقيد إلى عملية التوليد ، عن طريق إلحاق الملفات المُنشأة بتلميحات tslint مسبقًا).
قد يكون استخدام أحرف البدل مفيدًا أيضًا في تطبيق قواعد معينة بشكل تصريحي على أنواع محددة فقط من المصادر (اختبارات رئيسية / اختبارات / اختبارات e2e) من تكوين tslint ، وليس من كل ملف على حدة.

ما رأيك؟

إذا كنت لا ترغب في وضع التعليقات في الملف ، فلا تقم ببساطة بتمرير الملف إلى tslint لإجراء الفحص ، أليس كذلك؟

من الصعب جدًا إضافة المزيد من الخيارات في مكان آخر عندما يكون هناك وسيلتان على الأقل لتحقيق استبعاد (جزئي) للملف

إذا كنت لا ترغب في وضع تعليقات في الملف ، فلا تقم ببساطة بتمرير الملف إلى tslint لإجراء الفحص ، أليس كذلك؟

هذا هو بالضبط ما فعلته ، ولكن الآن لم يتم التحقق من أي من القواعد مقابل الملفات المستبعدة.

من الصعب جدًا إضافة المزيد من الخيارات في مكان آخر عندما يكون هناك وسيلتان على الأقل لتحقيق استبعاد (جزئي) للملف

نعم ، هذا ما توقعته كإجابة ؛) كانت لدي أيضًا بعض الشكوك - على الأقل حول التنفيذ (الذي حاولت أن أبقيه بسيطًا قدر الإمكان).

في الواقع ، إذا كان هذا سيتم تنفيذه ، فسيكون مفيدًا ، إذا كان بإمكانك تحديد ثوابت لتضمين واستبعاد أنماط ، لذلك لا يتعين عليك نسخ نمط التضمين / الاستبعاد نفسه إلى جميع القواعد حيث تريد التصفية نفس الملفات ... اعتقدت أنه قد لا يكون من المعقول جعل المثال أكثر تعقيدًا ، لكنني كنت أفكر في شيء من هذا القبيل:

{
    "constants": {
        "generatedFilesGlob": "**/generated.ts",
        "someOtherConstant": "some other value, that could be reused",
        ...
    },
    "rules": {
        "class-name": true,
        "some-otherrule": [ true, "arg1", "arg2", "arg3"],
        "rule-with-exclude": [ {"exclude": "generatedFilesGlob"}, "arg1", "arg2", "arg3"],
        ...
    }
}

لكن هذا من شأنه أن يجعل ملف التكوين أكثر صعوبة في التحليل. دفعني ذلك إلى التفكير في دعم ملفات js للتكوين ، بالإضافة إلى ملفات json. على سبيل المثال:

const generatedFilesGlob = "**/generated.ts";
const allExceptGenerated = {exclude: generatedFilesGlob};
module.exports = {
    "rules": {
        "class-name": true,
        "some-otherrule": [ true, "arg1", "arg2", "arg3"],
        "rule-with-exclude": [ allExceptGenerated , "arg1", "arg2", "arg3"],
        "another-rule-with-the-same-exclude-pattern": [ allExceptGenerated , "arg1", "arg2", "arg3"],
        ...
    }
}

استخدام ملفات JavaScript مع الوحدات النمطية (مثل gulp) له فائدة أخرى - فهو يسمح بالتعليق وليس صارمًا بشأن الفواصل بعد العنصر الأخير في المصفوفة أو الخاصية في الكائن.

@ atsu85 مشكلة مثيرة للاهتمام ، ولكن كما أشارت myitcv فأنا متردد في إدخال قوائم / globs إلى tslint.json بسبب التعقيد / الفوضى الإضافية في ملف التكوين. أوافق على أن TSLint يجب أن تقبل ملفات .js للتكوين بالإضافة إلى ملفات .json ببساطة. أعتقد أن هذا سيساعدك على معالجة حالة الاستخدام - يمكنك إعداد مهمتي إنشاء tslint (واحدة لمصادرك العادية ، وواحدة للمصادر التي تم إنشاؤها) وتعطيل قاعدة class-name برمجيًا في واحدة منهم في نفس الملف tslintConfig.js .

قدم # 1065 لدعم ملفات التكوين .js

عادل بما فيه الكفاية ، سأغلق هذه المشكلة لصالح ملفات التكوين js فقط

لدي حالة استخدام لهذا قد يكون لها معنى. لدي ملفات اختبار (* .spec.ts) أرغب في مشاركة معظم قواعد TSLint الخاصة بي من نوع Typescript ، حيث تنطبق ممارسات الترميز الجيدة على اختباراتي أيضًا.

ومع ذلك ، أقوم باختبار بعض الثوابت التي تم تكوينها لقاعدة "الأرقام السحرية" ، حتى لا يكون لديك 5 في الكود الخاص بي:
(Foo.substr(0,5);
ولكن تأكد من أنه ثابت
(Foo.substr(0,CONSTANT.FIVE);

على هذا النحو ، فإن حالة الاختبار الخاصة بي للثبات الخاص بي والمضمنة من ملف شائع ، لديها اختبار للتأكد من أن الثابت FIVE = 5 مضبوط دائمًا. يفشل الاختبار ثم expect(CONSTANTS.FIVE).toBe(5); في فحص TSLint نظرًا لاستخدام الرقم السحري في الاختبار. على الرغم من أنني لا أختبر جميع الثوابت بهذه الطريقة ، إلا أنني أريد التحقق من هذه الإعدادات الرقمية للتأكد من أنها لا تتغير حيث من المتوقع أن تظل بالحجم المحدد.

يمكنني استخدام تكوينين مختلفين لـ TSLint ، لكنني أريد حقًا تجنب خروجهم عن المزامنة ، أو عند إضافة قاعدة جديدة ، يجب القيام بذلك في أماكن متعددة.

يمكنني إجراء / * tslint: disable : no-magic-number * / للملف الواحد لهذه الاختبارات المحددة التي تعمل معي ، ولكن ربما تحتاج بعض الحالات الأخرى في ملف الاختبارات إلى أن تكون القاعدة العامة استثناءً ، وبدلاً من تحديث كل * .spec.ts ، هل سيعمل النمط العام للقاعدة؟

لدي حالة استخدام مماثلة لـChowarmaan.

لدي ملفات اختبار *.test.ts أستخدم فيها تبعيات المطورين ، على سبيل المثال enzyme .
في tslint.json ، تم تمكين قاعدة no-implicit-dependencies وأريد تعطيل هذه القاعدة مقابل *.test.ts . ملفات الاختبار هذه ليست كلها في نفس المجلد ، لذا يتعين علي الآن وضع:

/* tslint:disable:no-implicit-dependencies */

في البداية على كل ملف اختبار وهو أمر مزعج

هذه مشكلة مماثلة أواجهها بالإضافة إلى

هذه. 100٪. وجود هذه المشكلة مع monorepo حيث يتم سرد تبعيات الاختبار في مساحة العمل ، لذا فإن tslint يبكي حول no-implicit-dependencies . يجب أن يتم ذلك باستخدام ملف تكوين واحد حتى يظل فحص IDE يعمل

أعتقد أن هذه المشكلة مرتبطة أيضًا بالرقم 3447

سأضيف إلى هذا الموضوع الذي لا معنى له أيضًا. أنا بصدد تنفيذ متجر NgRx في مشروعي Angular. يصيح بناء AOT في وجهي عندما أقوم بتصدير مرجع ثابت إلى دالة ...

export const reducer = ( state = initialState, action: CurrentAction): CurrentState => {...}

إعطائي خطأ Function expressions are not supported in decorators in 'reducers' . تأتي المشكلة بسبب قواعد الفحص لدينا. لقد قمنا بتمكين قاعدة only-arrow-functions وجه التحديد عبر المشروع ... سيكون من الرائع إضافة مطابقة النمط على الاستبعاد لنقول استبعاد ملفات *.reducer.ts كمثال لهذه القاعدة المحددة ولكن مع السماح يبقى سليما لكل ملف آخر.

كما هو ، فإن إضافة هذا السطر إلى أعلى الملف لكل ملف مخفض يعد أمرًا مرهقًا. يبدو أن هناك طريقة أفضل.

Necrobumping هذا أيضا. أحاول إضافة tslint-microsoft-contrib إلى مشروع Vue ومجموعة من قواعده تقصف ملفات .vue ؛ قد يكون هذا حلًا بديلاً مفيدًا لمشكلات مثل هذه قبل أن يشرع مؤلفو القواعد في التخلص من هذه الأخطاء - إذا اختاروا ذلك. نظرًا لأنه يقف ، فإن إضافة تعليق لتعطيل مجموعة من القواعد في كل ملف Vue أكتبه أمر مرهق حقًا. من المنطقي أيضًا أن تكون أقل صرامة في كود واجهة المستخدم أو التعامل مع مصطلحات إطار العمل ، مثل استخدام الصادرات الافتراضية

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات