Tslint: TSLint übernimmt keine zusätzlichen Regeln.

Erstellt am 13. Jan. 2016  ·  20Kommentare  ·  Quelle: palantir/tslint

Ich habe dieses Problem ursprünglich in den zusätzlichen TSLint-Regeln von Microsoft gemeldet , aber vielleicht ist es hier besser gemeldet:

TSLint funktioniert einwandfrei, übernimmt aber nicht die von diesem Modul bereitgestellten Regeln. Folgendes habe ich getan:

  1. npm install tslint-microsoft-contrib --save-dev
  2. Es wurden mehrere Möglichkeiten zum Hinzufügen des Regelverzeichnisses ausprobiert:

    1. In tslint.json "rulesDirectory": "node_modules/tslint-microsoft-contrib" als Root-Eigenschaft hinzugefügt.

    2. In package.json , wo ich dies als NPM-Skript für die Eigenschaft script ausführe, habe ich tslint --rules-dir node_modules/tslint-microsoft-contrib index.js

  3. Die Flags wurden der Datei tslint.json hinzugefügt, die dieses Modul in der Eigenschaft rules bereitstellt.

Unterm Strich konnte ich dies nicht mein Leben lang zum Laufen bringen, wenn ich dies in einem NPM-Skript verwende. Ist das das Problem? Können Sie diese Regeln im Zusammenhang mit der Ausführung innerhalb von NPM einfach nicht aufgreifen? Jede Hilfe wäre dankbar. Vielen Dank.

Question

Hilfreichster Kommentar

Es kann jemandem weiterhelfen: Nachdem ich die Quelle gelesen hatte, habe ich erfahren, dass benutzerdefinierte Regeln wie folgt geladen werden:

  1. Nehmen Sie den Einstellungsnamen in tslint.json
  2. führende und nachgestellte Satzzeichen entfernen
  3. kamelisieren den Namen
  4. 'Regel' anhängen
  5. '.js' anhängen
  6. Versuchen Sie, diese Datei aus jedem rulesDirectory zu require laden

"foo-bar": true in tslint.json führt also zu einem require('yourRulesDirectory/fooBarRule.js')

Alle 20 Kommentare

@cerebrl Welche Version von TSLint verwenden Sie? Ich würde empfehlen, v3.2.1 wenn Sie noch nicht dabei sind.

Die Eigenschaft --rules-dir oder rulesDirectoy sollte auf das Verzeichnis mit den _built_ .js Regeldateien zeigen. Ich weiß, dass dies zunächst nicht offensichtlich sein kann.

Ich habe das gleiche Problem und habe ein Repo erstellt, in dem es sich manifestiert. Ich verwende tslint 3.2.1.

Hier ist meine package.json:
https://github.com/janjarfalk/ionic2-angular2-typescript-boilerplate/blob/master/package.json

Hier ist meine tslint.json:
https://github.com/janjarfalk/ionic2-angular2-typescript-boilerplate/blob/master/tslint.json

Die "export-name-rule" wird nicht übernommen. Wenn ich npm starte, starte lint

Ich denke, dies ist ein Fehler in der Art und Weise, wie TSLint mit Pfaden umgeht - wir arbeiten jetzt daran, ihn zu beheben. In der Zwischenzeit werden die Dinge korrekt funktionieren, wenn Sie TSLint global installieren und einfach tslint -s tslint/formatters -t color --config tslint.json app/{pages,services}/**/*.ts von der Befehlszeile ausführen, erhalten Sie die richtigen Ergebnisse.

Ich denke , der Grund , warum es nicht für Leute arbeitet mit NPM - Skripten ist , dass der tslint Befehl in einer npm Skript Referenzen node_modules/.bin/tslint , so dass es zu suchen versucht node_modules/.bin/tslint/node_modules/tslint-microsoft-contrib und doesn finde keine benutzerdefinierten Regeln.

Ich habe #910 und #911 eingereicht, um diese Erfahrung zu verbessern.

Ich habe dies ohne Probleme im Repo von @janjarfalk zum

Ich musste sein Skript ändern in:

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

Die Option -r hat die zusätzlichen Regeln übernommen und das **-Glob (anstelle des {pages,services}-Globs) die .ts-Dateien.

Zwei Leute haben jetzt versucht, tslint-Optionen in die Datei rules.json einzufügen... was nicht funktioniert. Vielleicht ist es eine gute Idee, dies in der Readme zu klären.

Eigentlich @ HamletDRC , theoretisch sollte es funktionieren. Im Moment gibt es jedoch einige seltsame Fehler bei der Handhabung relativer Pfade. Ich habe das hoffentlich alles in https://github.com/palantir/tslint/pull/912 behoben :)

Ich möchte diesen Thread mit der Info aktualisieren, dass jetzt alles funktioniert.

Ich habe die Eigenschaft "rulesDirectory": "node_modules/tslint-microsoft-contrib" aus tslint.json und verwende einfach den Befehl -r , um auf node_modules/tslint-microsoft-contrib .

Ich kann bestätigen, dass, zumindest für mich, das Hinzufügen der Eigenschaft rulesDirectory wieder zu tslint.json das hier gemeldete ursprüngliche Problem zuverlässig erzeugt.

Danke an alle für die Hilfe!

@cerebrl @janjarfalk : Wir haben gerade TSLint v3.2.2 veröffentlicht, das diesen Fehler beheben sollte. Wenn Sie in der Befehlszeile ein Verzeichnis für benutzerdefinierte Regeln angeben, wird der Pfad relativ zum aktuellen Arbeitsverzeichnis behandelt (wie zuvor). Wenn Sie jedoch einen Pfad in einer tslint.json Datei angeben, ist der Pfad jetzt relativ zum Speicherort der tslint.json Datei (was meiner Meinung nach die Dinge viel intuitiver macht.)

Ich habe Ihr Repo mit v3.2.2 @janjarfalk durchgesehen und getestet und festgestellt, dass das Ausführen von npm run lint jetzt wie erwartet funktioniert. Probieren Sie es selbst aus und lassen Sie es mich wissen, wenn Sie auf Fehler oder Probleme stoßen!

@JKillian : Danke!

Aber ich glaube, Sie haben einen Fehler eingeführt.
Das Pfad-Array funktioniert nicht wie erwartet.

"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 Interessant, obwohl ich nicht davon überzeugt bin, dass dies ein Fehler ist. Sobald TSLint einen ungültigen Pfad findet, wirft es einen Fehler und bricht ab. Ich bin mir nicht sicher, ob es sich für mich lohnt, etwas Ausgefalleneres zu tun... Glaubst du, ein anderes Verhalten wäre besser?

Ich glaube, du hast es falsch verstanden. Sowohl tslint/rules als auch node_modules/tslint-microsoft-contrib sind gültige Pfade. Im Moment nimmt es nur zusätzliche Regeln aus dem ersten Pfad im Array auf.

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

Ich habe dieses Repo https://github.com/janjarfalk/ionic2-angular2-typescript-boilerplate.git mit einem Setup aktualisiert, das das Problem reproduziert, wenn npm run lint .

Fall A - tslint-microsoft-contrib zuerst:

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

Fall B - Tslint/Regeln zuerst:

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

Danke für die ausführliche Erklärung @janjarfalk , ich habe dich tatsächlich falsch verstanden. Das scheint definitiv ein Bug zu sein, ich werde mich darum kümmern!

Das ist ein separates Problem, ich habe Nr. 928 dafür eingereicht.

@janjarfalk Dies sollte jetzt in v3.3.0 behoben sein. Lassen Sie es uns wie immer wissen, wenn Sie auf andere Probleme stoßen :smiley:

@JKillian Genial ! Wird besorgt! Freue mich zu helfen!

Es kann jemandem weiterhelfen: Nachdem ich die Quelle gelesen hatte, habe ich erfahren, dass benutzerdefinierte Regeln wie folgt geladen werden:

  1. Nehmen Sie den Einstellungsnamen in tslint.json
  2. führende und nachgestellte Satzzeichen entfernen
  3. kamelisieren den Namen
  4. 'Regel' anhängen
  5. '.js' anhängen
  6. Versuchen Sie, diese Datei aus jedem rulesDirectory zu require laden

"foo-bar": true in tslint.json führt also zu einem require('yourRulesDirectory/fooBarRule.js')

@alexanderbird , das hauptsächlich im Abschnitt "Wichtige Konventionen" auf der README- und Docs-Site behandelt werden sollte . offen für PRs, wenn Sie der Meinung sind, dass die Dokumentation verbessert werden könnte.

@alexanderbird Danke! Ich habe zunächst hier https://github.com/mgechev/codelyzer gesucht und keine Anweisungen für Namenskonventionen gefunden. Sobald ich den Namen meiner Regel geändert habe, hat es funktioniert! Wahrscheinlich gibt es zu beiden Projekten ein Doc-Update, das notwendig ist.

🤖 Beep boop! 👉 TSLint ist veraltet 👈 und Sie sollten zu typescript-eslint wechseln ! 🤖

🔒 Dieses Problem wird gesperrt, um weitere unnötige Diskussionen zu vermeiden. Dankeschön! 👋

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen