Tslint: TSLint ne récupérera pas de règles supplémentaires.

Créé le 13 janv. 2016  ·  20Commentaires  ·  Source: palantir/tslint

J'ai initialement signalé ce problème dans les règles TSLint supplémentaires de Microsoft , mais il est peut-être préférable de le signaler ici :

TSLint fonctionne bien, mais il ne récupérera pas les règles fournies par ce module. Voici ce que j'ai fait :

  1. npm install tslint-microsoft-contrib --save-dev
  2. J'ai essayé plusieurs façons d'ajouter le répertoire des règles :

    1. Dans tslint.json ajouté "rulesDirectory": "node_modules/tslint-microsoft-contrib" en tant que propriété racine.

    2. Dans package.json , où j'exécute ceci en tant que script NPM sur la propriété script , j'ai écrit tslint --rules-dir node_modules/tslint-microsoft-contrib index.js

  3. Ajout des drapeaux au fichier tslint.json que ce module fournit dans la propriété rules .

En fin de compte, je n'ai pas pu faire fonctionner cela pendant toute ma vie en l'utilisant dans un script NPM. C'est ça le problème ? Ne pouvez-vous tout simplement pas reprendre ces règles dans le contexte de l'exécution de cela dans NPM ? Toute aide serait appréciée. Merci.

Question

Commentaire le plus utile

Cela peut aider quelqu'un plus tard : après avoir lu la source, j'ai appris que les règles personnalisées sont chargées de la manière suivante :

  1. Prenez le nom du paramètre dans tslint.json
  2. supprimer la ponctuation de début et de fin
  3. caméliser le nom
  4. ajouter 'Règle'
  5. ajouter '.js'
  6. Essayez de require ce fichier à partir de chaque rulesDirectory

Donc "foo-bar": true dans tslint.json se traduira par un require('yourRulesDirectory/fooBarRule.js')

Tous les 20 commentaires

@cerebrl Quelle version de TSLint utilisez-vous ? Je recommanderais d'essayer v3.2.1 si vous n'y êtes pas déjà.

La propriété --rules-dir ou rulesDirectoy doit pointer vers le répertoire contenant les fichiers de règles _built_ .js . Je sais que cela peut être non évident au début.

J'ai le même problème et j'ai créé un dépôt où il se manifeste. J'utilise tslint 3.2.1.

Voici mon package.json :
https://github.com/janjarfalk/ionic2-angular2-typescript-boilerplate/blob/master/package.json

Voici mon tslint.json :
https://github.com/janjarfalk/ionic2-angular2-typescript-boilerplate/blob/master/tslint.json

La "règle de nom d'exportation n'est pas récupérée. Lorsque j'exécute npm, exécutez lint

Je pense que c'est un bogue avec la façon dont TSLint gère les chemins - travaille à le corriger maintenant. En attendant, les choses fonctionneront correctement si vous installez TSLint globalement et exécutez simplement tslint -s tslint/formatters -t color --config tslint.json app/{pages,services}/**/*.ts partir de la ligne de commande, vous obtiendrez les bons résultats.

Je pense que la raison pour laquelle cela ne fonctionne pas pour les personnes utilisant des scripts npm est que la commande tslint dans un script npm fait référence à node_modules/.bin/tslint , elle essaie donc de rechercher node_modules/.bin/tslint/node_modules/tslint-microsoft-contrib et ne Je ne trouve aucune règle personnalisée.

J'ai déposé #910 et #911 pour améliorer cette expérience.

J'ai réussi à ce que cela fonctionne sans problème sur le dépôt de

J'ai dû changer son script en :

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

L'option -r a récupéré les règles supplémentaires et le glob ** (au lieu du glob {pages, services}) a récupéré les fichiers .ts.

Deux personnes ont maintenant essayé de mettre des options tslint dans le fichier rules.json... ce qui ne fonctionnera pas. Peut-être que clarifier cela dans le fichier readme est une bonne idée.

En fait @HamletDRC , cela devrait théoriquement fonctionner. Il y a cependant quelques bugs étranges en ce moment avec la façon dont les chemins relatifs sont gérés. J'espère avoir corrigé tout cela dans https://github.com/palantir/tslint/pull/912 :)

J'aimerais mettre à jour ce fil avec l'information que tout fonctionne maintenant.

J'ai supprimé la propriété "rulesDirectory": "node_modules/tslint-microsoft-contrib" du tslint.json et j'ai juste utilisé la commande -r pour pointer vers node_modules/tslint-microsoft-contrib .

Je peux confirmer que, du moins pour moi, l'ajout de la propriété rulesDirectory propriété tslint.json produit de manière fiable le problème d'origine signalé ici.

Merci à tous pour l'aide !

@cerebrl @janjarfalk : Nous venons de publier TSLint v3.2.2 qui devrait corriger ce bogue. Si vous spécifiez un répertoire de règles personnalisées sur la ligne de commande, le chemin est traité comme relatif au répertoire de travail actuel (comme il l'était auparavant). Cependant, si vous spécifiez un chemin dans un fichier tslint.json , le chemin est maintenant relatif à l'emplacement du fichier tslint.json (ce qui rend les choses beaucoup plus intuitives à mon avis.)

J'ai parcouru et testé votre référentiel avec la v3.2.2 @janjarfalk et npm run lint fonctionne désormais comme prévu. Essayez les choses vous-même et faites-moi savoir si vous rencontrez des bugs ou des problèmes !

@JKillian : Merci !

Mais je pense que vous avez introduit un bug.
Le tableau de chemins ne fonctionne pas comme prévu.

"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 Intéressant, bien que je ne sois pas convaincu qu'il s'agisse d'un bug. Dès que TSLint trouve un chemin invalide, il renvoie une erreur et abandonne. Je ne suis pas sûr qu'il me semble que ça vaille la peine de faire quelque chose de plus sophistiqué que ça... Pensez-vous qu'un comportement différent serait préférable ?

Je pense que tu as mal compris. tslint/rules et node_modules/tslint-microsoft-contrib sont des chemins valides. Pour le moment, il ne récupère que les règles supplémentaires du premier chemin du tableau.

"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.

J'ai mis à jour ce référentiel https://github.com/janjarfalk/ionic2-angular2-typescript-boilerplate.git avec une configuration qui reproduit le problème en exécutant npm run lint .

Cas A - tslint-microsoft-contrib en premier :

// 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

Cas B - tslint/rules first :

// 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

Merci pour l'explication détaillée @janjarfalk , je vous ai en effet mal compris. Cela ressemble vraiment à un bug, je vais m'en occuper !

C'est un problème distinct, j'ai déposé le numéro 928 pour cela.

@janjarfalk Cela devrait être corrigé maintenant dans la v3.3.0. Comme toujours, faites-nous savoir si vous rencontrez d'autres problèmes :smiley:

@JKillian Génial ! Ça ira! Heureux d'aider!

Cela peut aider quelqu'un plus tard : après avoir lu la source, j'ai appris que les règles personnalisées sont chargées de la manière suivante :

  1. Prenez le nom du paramètre dans tslint.json
  2. supprimer la ponctuation de début et de fin
  3. caméliser le nom
  4. ajouter 'Règle'
  5. ajouter '.js'
  6. Essayez de require ce fichier à partir de chaque rulesDirectory

Donc "foo-bar": true dans tslint.json se traduira par un require('yourRulesDirectory/fooBarRule.js')

@alexanderbird qui devrait principalement être couvert par la section "Conventions importantes" du site README et docs . ouvert aux RP si vous pensez que la doc pourrait être améliorée.

@alexanderbird Merci ! J'ai commencé par regarder ici https://github.com/mgechev/codelyzer et je n'ai vu aucune instruction pour les conventions de nommage. Dès que j'ai changé le nom de ma règle, ça a commencé à fonctionner ! Il y a probablement une mise à jour de la doc sur les deux projets qui est nécessaire.

Bip boop ! 👉 TSLint est obsolète 👈 et vous devriez passer à typescript-eslint ! ??

🔒 Ce problème est verrouillé pour éviter d'autres discussions inutiles. Merci! ??

Cette page vous a été utile?
0 / 5 - 0 notes