Tslint: TSLint не берет дополнительных правил.

Созданный на 13 янв. 2016  ·  20Комментарии  ·  Источник: palantir/tslint

Первоначально я сообщил об этой проблеме в дополнительных правилах Microsoft TSLint , но, возможно, лучше сообщить здесь:

TSLint работает нормально, но не поддерживает правила, предоставляемые этим модулем. Вот что я сделал:

  1. npm install tslint-microsoft-contrib --save-dev
  2. Пробовал несколько способов добавить каталог правил:

    1. В tslint.json добавлено "rulesDirectory": "node_modules / tslint-microsoft-contrib" как корневое свойство.

    2. В package.json , где я запускаю это как сценарий NPM для свойства script , я написал tslint --rules-dir node_modules/tslint-microsoft-contrib index.js

  3. Добавлены флаги в файл tslint.json который этот модуль предоставляет в свойстве rules .

Суть в том, что я не мог заставить это работать на всю жизнь, используя это в сценарии NPM. Вот в чем проблема? Можете ли вы просто не взять эти правила из контекста запуска этого в NPM? Любая помощь будет оценена по достоинству. Спасибо.

Question

Самый полезный комментарий

Это может помочь кому-то в будущем: прочитав исходный код, я узнал, что пользовательские правила загружаются следующим образом:

  1. Возьмите имя настройки в tslint.json
  2. удалить начальную и конечную пунктуацию
  3. верблюжье имя
  4. добавить "Правило"
  5. добавить '.js'
  6. Попытка require этого файла из каждого каталога правил

Итак, "foo-bar": true в tslint.json приведет к require('yourRulesDirectory/fooBarRule.js')

Все 20 Комментарий

@cerebrl Какую версию TSLint вы используете? Я бы рекомендовал попробовать v3.2.1 если вы еще этого не сделали.

Свойство --rules-dir или rulesDirectoy должно указывать на каталог с файлами правил _built_ .js . Я знаю, что сначала это может показаться неочевидным.

У меня такая же проблема, и я создал репо, где она проявляется. Я использую tslint 3.2.1.

Вот мой package.json:
https://github.com/janjarfalk/ionic2-angular2-typescript-boilerplate/blob/master/package.json

Вот мой tslint.json:
https://github.com/janjarfalk/ionic2-angular2-typescript-boilerplate/blob/master/tslint.json

Правило "имя-экспорта" не используется. Когда я запускаю npm run lint

Я думаю, что это ошибка в том, как TSLint обрабатывает пути - сейчас я работаю над ее исправлением. А пока все будет работать правильно, если вы установите TSLint глобально и просто запустите tslint -s tslint/formatters -t color --config tslint.json app/{pages,services}/**/*.ts из командной строки, и вы получите правильные результаты.

Я думаю, что причина, по которой он не работает для людей, использующих сценарии npm, заключается в том, что команда tslint в сценарии npm ссылается на node_modules/.bin/tslint , поэтому она пытается найти node_modules/.bin/tslint/node_modules/tslint-microsoft-contrib и не не нахожу никаких специальных правил.

Я подал # 910 и # 911, чтобы улучшить этот опыт.

Я заставил это работать без проблем с репо @janjarfalk .

Мне пришлось изменить его сценарий на:

  "scripts": {
    "lint": "tslint -s tslint/formatters -t color --config tslint.json app/**/*.ts -r node_modules/tslint-microsoft-contrib/",
    "validate": "npm ls"
  },

Параметр -r выбирает дополнительные правила, а ** glob (вместо glob {pages, services}) выбирает файлы .ts.

Два человека теперь попытались поместить параметры tslint в файл rules.json ... что не сработает. Возможно, уточнить это в ридми - хорошая идея.

Собственно @HamletDRC , теоретически должно работать. Однако сейчас есть несколько странных ошибок, связанных с обработкой относительных путей. Надеюсь, все это исправлено в https://github.com/palantir/tslint/pull/912 :)

Я хотел бы обновить эту ветку информацией о том, что теперь все работает.

Я удалил свойство "rulesDirectory": "node_modules/tslint-microsoft-contrib" из tslint.json и просто использовал команду -r чтобы указать на node_modules/tslint-microsoft-contrib .

Я могу подтвердить, что, по крайней мере, для меня, добавление свойства rulesDirectory обратно к tslint.json действительно вызывает исходную проблему, о которой здесь сообщается.

Спасибо всем за помощь!

@cerebrl @janjarfalk : Мы только что выпустили TSLint v3.2.2, который должен исправить эту ошибку. Если вы укажете каталог настраиваемых правил в командной строке, путь будет рассматриваться как относительный к текущему рабочему каталогу (как это было раньше). Однако, если вы укажете путь в файле tslint.json , он теперь будет относиться к местоположению файла tslint.json (что, на мой взгляд, делает вещи намного более интуитивно понятными).

Я просмотрел и протестировал ваше репо с v3.2.2 @janjarfalk и обнаружил, что запуск npm run lint теперь работает должным образом . Попробуйте сами и дайте мне знать, если вы столкнетесь с какими-либо ошибками или проблемами!

@JKillian : Спасибо!

Но я думаю, вы внесли ошибку.
Массив путей работает не так, как ожидалось.

"rulesDirectory": ["node_modules/tslint-microsoft-contrib"]
// Works as expected.
"rulesDirectory": ["tslint/rules"]
// Works as expected.
"rulesDirectory": ["node_modules/tslint-microsoft-contrib", "tslint/rules"]
// Warnings from `tslint-microsoft-contrib` ONLY.
"rulesDirectory": ["tslint/rules", "node_modules/tslint-microsoft-contrib"]
// Warnings from `tslint/rules` ONLY.

@janjarfalk Интересно, хотя я не уверен, что это ошибка. Как только TSLint обнаруживает недопустимый путь, он выдает ошибку и прерывает работу. Не уверен, что мне стоит делать что-то более интересное ... Как вы думаете, было бы лучше другое поведение?

Я думаю, вы неправильно поняли. Оба tslint/rules и node_modules/tslint-microsoft-contrib являются допустимыми путями. Прямо сейчас он берет дополнительные правила только из первого пути в массиве.

"rulesDirectory": ["node_modules/tslint-microsoft-contrib"]
// If this result in warnings...
"rulesDirectory": ["tslint/rules"]
// ...and this doesn't result in any warnings.
"rulesDirectory": ["tslint/rules", "node_modules/tslint-microsoft-contrib"]
// I still expect this to result in warnings, but it doesn't.

Я обновил это репо https://github.com/janjarfalk/ionic2-angular2-typescript-boilerplate.git установкой, которая воспроизводит проблему с запуском npm run lint .

Случай A - сначала tslint-microsoft-contrib:

// tslint.json
{
  "rulesDirectory": ["node_modules/tslint-microsoft-contrib", "tslint/rules"],
  "rules": {
    "missing-jsdoc": true, // A rule form Microsoft
    "export-class-name": true // A rule from me (tslint/rules folder)
  }
}
// ACUTAL output

   app/MyApp.ts 
-- [1, 1] - File missing JSDoc comment at the top-level: app/MyApp.ts

// EXPECTED output

   app/MyApp.ts 
-- [1, 1] - File missing JSDoc comment at the top-level: app/MyApp.ts

   app/pages/page1/page1.ts 
-- [1, 1] - The exported module name must match the file name. Found: app/pages/page1/page1.ts and Page1

Случай B - сначала tslint / rules:

// tslint.json
{
  "rulesDirectory": ["tslint/rules", "node_modules/tslint-microsoft-contrib"],
  "rules": {
    "missing-jsdoc": true, // A rule form Microsoft
    "export-class-name": true // A rule from me (tslint/rules folder)
  }
}
// ACTUAL output

   app/pages/page1/page1.ts 
-- [1, 1] - The exported module name must match the file name. Found: app/pages/page1/page1.ts and Page1

// EXPECTED output

   app/MyApp.ts 
-- [1, 1] - File missing JSDoc comment at the top-level: app/MyApp.ts

   app/pages/page1/page1.ts 
-- [1, 1] - The exported module name must match the file name. Found: app/pages/page1/page1.ts and Page1

Спасибо за подробное объяснение @janjarfalk , я действительно вас неправильно понял. Это определенно похоже на ошибку, я займусь этим!

Это отдельная тема, я подал на нее №928.

@janjarfalk Это должно быть исправлено в v3.3.0. Как всегда, дайте нам знать, если у вас возникнут другие проблемы: smiley:

@JKillian Классно ! Сделаю! Рад помочь!

Это может помочь кому-то в будущем: прочитав исходный код, я узнал, что пользовательские правила загружаются следующим образом:

  1. Возьмите имя настройки в tslint.json
  2. удалить начальную и конечную пунктуацию
  3. верблюжье имя
  4. добавить "Правило"
  5. добавить '.js'
  6. Попытка require этого файла из каждого каталога правил

Итак, "foo-bar": true в tslint.json приведет к require('yourRulesDirectory/fooBarRule.js')

@alexanderbird, который в основном должен быть охвачен разделом «Важные соглашения» на сайте README и документации . открыт для PR, если вы думаете, что документы могут быть улучшены.

@alexanderbird Спасибо! Я начал с просмотра здесь https://github.com/mgechev/codelyzer и не увидел никаких инструкций по соглашениям об именах. Как только я изменил название своего правила, оно заработало! Возможно, в обоих проектах есть обновление документации, которое необходимо.

🤖 Бип-буп! 👉 TSLint устарел 👈 и вам следует перейти на typescript-eslint ! 🤖

🔒 Эта проблема заблокирована, чтобы предотвратить дальнейшие ненужные обсуждения. Спасибо! 👋

Была ли эта страница полезной?
0 / 5 - 0 рейтинги