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 :
npm install tslint-microsoft-contrib --save-dev
tslint.json
ajouté "rulesDirectory": "node_modules/tslint-microsoft-contrib" en tant que propriété racine.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
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.
@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
.
// 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
// 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 :
require
ce fichier à partir de chaque rulesDirectoryDonc "foo-bar": true
dans tslint.json se traduira par un require('yourRulesDirectory/fooBarRule.js')
@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! ??
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 :
require
ce fichier à partir de chaque rulesDirectoryDonc
"foo-bar": true
dans tslint.json se traduira par unrequire('yourRulesDirectory/fooBarRule.js')