Schnell, konfigurierbar, erweiterbar, flexibel und schöner fallen für Go. Drop-In-Austausch von Golint. Revive bietet einen Rahmen für die Entwicklung benutzerdefinierter Regeln und ermöglicht es Ihnen, ein striktes Voreingang für die Verbesserung Ihrer Entwicklungs- und Code -Überprüfungsprozesse zu definieren .
var-namingrevive als Bibliothekgo install github.com/mgechev/revive@latestOder lassen Sie eine ausführbare Datei von der Seite "Releases" veröffentlicht.
Sie können den Hauptzweig (einschließlich des letzten Commits) mit:
go install github.com/mgechev/revive@master Da das Standardverhalten von revive mit golint kompatibel ist, ohne zusätzliche Flags bereitzustellen, ist der einzige Unterschied, den Sie bemerken würden, eine schnellere Ausführung.
revive unterstützt ein -config Flag, dessen Wert einer TOML -Datei entsprechen sollte, in der beschrieben wird, welche Regeln für revive 's Leinen verwendet werden sollen. Wenn nicht zur Verfügung gestellt, wird revive versucht, eine globale Konfigurationsdatei zu verwenden (die angenommen wird, dass sie sich bei $HOME/revive.toml befindet). Andernfalls verwendet revive , wenn keine Konfigurations-Toml-Datei gefunden wird, einen integrierten Satz von Standard-Lining-Regeln.
Ein Volumen muss montiert werden, um das aktuelle Repository mit dem Container zu teilen. Weitere Informationen finden Sie in der Dokumentation der Bindmontage Docker
docker run -v " $( pwd ) " :/var/ < repository > ghcr.io/mgechev/revive:v1.3.7 -config /var/ < repository > /revive.toml -formatter stylish ./var/kidle/...-v ist für das Volumenghcr.io/mgechev/revive:v1.3.7 ist der Bildname und seine Version entspricht dem revive -BefehlWenn Sie Revive mit Bazel verwenden möchten, schauen Sie sich die Regeln an, die Atlassian behauptet.
Unterstützung für VSCODE in VSCODE-GO.
Unterstützung für Goland über Dateibeobachter.
Unterstützung für Atom über Linter-Wiederholung.
Unterstützung für Vim über dichte Analyse/Ale.
let g: ale_linters = {
' go ' : [ ' revive ' ],
}Unterstützung für Neovim über NULL-ls.nvim.
require ( " null-ls " ). setup ({
sources = {
require ( " null-ls " ). builtins . diagnostics . revive
},
})CODEAC.IO - Der automatisierte Code -Review -Service integriert sich in GitHub, Bitbucket und GitLab (sogar selbst gehostet) und hilft Ihnen, technische Schulden zu bekämpfen. Überprüfen Sie Ihre Pull-Requests automatisch mit Revive. (kostenlos für Open-Source-Projekte)
Um revive in golangci-lint zu ermöglichen, müssen Sie der Liste der aktivierten Linter revive hinzufügen:
# golangci-lint configuration file
linters :
enable :
- revive Anschließend kann revive konfiguriert werden, indem ein Eintrag in den Abschnitt linters-settings der Konfiguration hinzugefügt wird, z. B.:
# golangci-lint configuration file
linters-settings :
revive :
ignore-generated-header : true
severity : warning
rules :
- name : atomic
- name : line-length-limit
severity : error
arguments : [80]
- name : unhandled-error
arguments : ["fmt.Printf", "myFunction"] Die obige Konfiguration ermöglicht drei revive : Atomic , Line-Length Limit- und Unbeschlossener Error und übergeben einige Argumente an die letzten beiden. Der Konfigurationsabschnitt dieses Dokuments enthält Details zum Konfigurieren revive . Beachten Sie, dass die revive in Toml ist, der von golangci-lint in Yaml ist.
Bitte beachten Sie, dass bei der Bereitstellung keine bestimmte Konfiguration sich revive wie go-lint verhalten wird, dh alle go-lint -Regeln sind aktiviert (die Tabellenabteilung der verfügbaren Regeln, die die go-lint -Regeln sind). Wenn eine Konfiguration bereitgestellt wird, sind nur Regeln in der Konfiguration aktiviert.
revive akzeptiert die folgenden Befehlszeilenparameter:
-config [PATH] - Pfad zur Konfigurationsdatei im TOML -Format, standardmäßig $HOME/revive.toml wenn vorhanden.
-exclude [PATTERN] - Muster für Dateien/Verzeichnisse/Pakete, die für die Linie ausgeschlossen werden sollen. Sie können die Dateien angeben, die Sie ausschließen möchten, um entweder als Paketname (dh github.com/mgechev/revive ) auszulegen, sie als einzelne Dateien (dh file.go ), Verzeichnisse (dh ./foo/... ) oder eine Kombination der drei aufzulisten. Wenn keine Ausschlussmuster angegeben sind, wird vendor/... standardmäßig ausgeschlossen.
-formatter [NAME] - Formatierer, die für die Ausgabe verwendet werden sollen. Die derzeit verfügbaren Formatters sind:
default - gibt die Fehler auf die gleiche Weise wie golint aus.json - gibt die Fehler im JSON -Format aus.ndjson - gibt das Fehler als Stream im Newline -Abgrenzungsformat (NDJSON) aus.friendly - gibt die Fehler aus, wenn sie gefunden werden. Zeigt die Zusammenfassung aller Fehler an.stylish - formatiert die Fehler in einem Tisch. Denken Sie daran, dass es die Ausgabe nicht streamen, sodass er im Vergleich zu anderen als langsamer wahrgenommen wird.checkstyle - gibt die Fehler im XML -Format aus, die mit dem von Javas Checkstyle kompatibel sind. -max_open_files - Maximale Anzahl geöffneter Dateien gleichzeitig. Standardmäßig unbegrenzt.
-set_exit_status - Setzen Sie den Exit -Status auf 1, wenn Probleme gefunden werden, überschreiben Sie errorCode und warningCode in der Konfiguration.
-version - REVIVE -Version erhalten.
revive -config revive.toml -exclude file1.go -exclude file2.go -formatter friendly github.com/mgechev/revive package/...revive.tomlrevive ignoriert file1.go und file2.gofriendly Formatierer formatiertgithub.com/mgechev/revive und die Dateien im packageMit Kommentaren können Sie den Linter für die gesamte Datei oder nur eine Reihe von Zeilen deaktivieren:
//revive:disable
func Public () {}
//revive:enable Der Snippet oben deaktiviert revive zwischen den revive:disable und revive:enable . Wenn Sie revive:enable , wird der Linter für den Rest der Datei deaktiviert.
Mit revive:disable-next-line und revive:disable-line Sie können revive in einer bestimmten Codezeile deaktivieren.
Sie können dasselbe auf Regelebene tun. Falls Sie nur eine bestimmte Regel deaktivieren möchten, können Sie verwenden:
//revive:disable:unexported-return
func Public () private {
return private
}
//revive:enable:unexported-return Auf diese Weise warnt revive Sie nicht, dass Sie ein Objekt eines unerportten Typs aus einer exportierten Funktion zurückgeben.
Sie können dokumentieren, warum Sie den Linter deaktivieren, indem Sie beispielsweise einen nachverfolgenden Text in der Richtlinie hinzufügen
//revive:disable Until the code is stable //revive:disable:cyclomatic High complexity score but easy to understand Sie können revive auch konfigurieren, um die Dokumentation von Linter Deaktivierungsanweisungen durch Hinzufügen durchzusetzen
[ directive . specify-disable-reason ]in der Konfiguration. Sie können die Schwere (Standardeinstellungen auf Warnung ) der Verletzung dieser Richtlinie festlegen
[ directive . specify-disable-reason ]
severity = " error " revive kann mit einer TOML -Datei konfiguriert werden. Hier ist eine Beispielkonfiguration mit einer Erklärung der einzelnen Eigenschaften:
# When set to false, ignores files with "GENERATED" header, similar to golint
ignoreGeneratedHeader = true
# Sets the default severity to "warning"
severity = " warning "
# Sets the default failure confidence. This means that linting errors
# with less than 0.8 confidence will be ignored.
confidence = 0.8
# Sets the error code for failures with the "error" severity
errorCode = 0
# Sets the error code for failures with severity "warning"
warningCode = 0
# Configuration of the `cyclomatic` rule. Here we specify that
# the rule should fail if it detects code with higher complexity than 10.
[ rule . cyclomatic ]
arguments = [ 10 ]
# Sets the severity of the `package-comments` rule to "error".
[ rule . package-comments ]
severity = " error " Standardmäßig aktivieren revive nur die Lining -Regeln, die in der Konfigurationsdatei benannt sind. Beispielsweise macht die vorherige Konfigurationsdatei revive , um nur zyklomatische und Paketkoments- Lining-Regeln zu aktivieren.
So aktivieren Sie alle verfügbaren Regeln, die Sie hinzufügen müssen:
enableAllRules = trueDies ermöglicht alle verfügbaren Regeln, unabhängig davon, welche Regeln in der Konfigurationsdatei genannt werden.
Um eine Regel zu deaktivieren, markieren Sie sie einfach als deaktiviert in der Konfiguration. Zum Beispiel:
[ rule . line-length-limit ]
Disabled = trueWenn Sie alle Regeln aktivieren, benötigen/können Sie noch bestimmte Konfigurationen für Regeln bereitstellen. Die folgende Datei ist eine Beispielkonfiguration, in der alle Regeln aktiviert sind, mit Ausnahme derjenigen, die explizit deaktiviert sind, und einige Regeln mit bestimmten Argumenten konfiguriert sind:
severity = " warning "
confidence = 0.8
errorCode = 0
warningCode = 0
# Enable all available rules
enableAllRules = true
# Disabled rules
[ rule . blank-imports ]
Disabled = true
[ rule . file-header ]
Disabled = true
[ rule . max-public-structs ]
Disabled = true
[ rule . line-length-limit ]
Disabled = true
[ rule . function-length ]
Disabled = true
[ rule . banned-characters ]
Disabled = true
# Rule tuning
[ rule . argument-limit ]
Arguments = [ 5 ]
[ rule . cyclomatic ]
Arguments = [ 10 ]
[ rule . cognitive-complexity ]
Arguments = [ 7 ]
[ rule . function-result-limit ]
Arguments = [ 3 ]
[ rule . error-strings ]
Arguments = [ " mypackage.Error " ] Die Standardkonfiguration von revive findet sich unter defaults.toml . Dies ermöglicht alle in golint verfügbaren Regeln und nutzt ihre Standardkonfiguration (dh so wie sie in golint festcodiert sind).
revive -config defaults.toml github.com/mgechev/revive Dadurch wird die Konfigurationsdatei defaults.toml , die default , verwendet und das LINTING über das Paket github.com/mgechev/revive ausgeführt.
revive -config config.toml -formatter friendly github.com/mgechev/revive Dadurch werden config.toml , das friendly Formatierer, verwendet und das Linting über das Paket github.com/mgechev/revive ausgeführt.
Das folgende Snippet enthält die empfohlene revive , die Sie in Ihrem Projekt verwenden können:
ignoreGeneratedHeader = false
severity = " warning "
confidence = 0.8
errorCode = 0
warningCode = 0
[ rule . blank-imports ]
[ rule . context-as-argument ]
[ rule . context-keys-type ]
[ rule . dot-imports ]
[ rule . error-return ]
[ rule . error-strings ]
[ rule . error-naming ]
[ rule . exported ]
[ rule . increment-decrement ]
[ rule . var-naming ]
[ rule . var-declaration ]
[ rule . package-comments ]
[ rule . range ]
[ rule . receiver-naming ]
[ rule . time-naming ]
[ rule . unexported-return ]
[ rule . indent-error-flow ]
[ rule . errorf ]
[ rule . empty-block ]
[ rule . superfluous-else ]
[ rule . unused-parameter ]
[ rule . unreachable-code ]
[ rule . redefines-builtin-id ]Sie können auch für jede Regel benutzerdefinierte Ausnahmen einrichten.
Es ist eine Alternative für das Global -exclude -Programm arg.
ignoreGeneratedHeader = false
severity = " warning "
confidence = 0.8
errorCode = 0
warningCode = 0
[ rule . blank-imports ]
Exclude =[ " **/*.pb.go " ]
[ rule . context-as-argument ]
Exclude =[ " src/somepkg/*.go " , " TEST " ]Sie können die folgenden Ausschlussmuster verwenden
src/pkg/mypkg/some.gosrc/**/*.pb.go~.(pb|auto|generated).go$TEST (gleich wie **/*_test.go )* und ~ Muster schließen alle Dateien aus (gleiche Wirkung wie die Deaktivierung der Regel) b. "" (leer) Muster schließt nichts ausHINWEIS: Legen Sie sich nicht
excludeum aus der oberen Ebene der TOML -Datei zu verwenden, dh "Paketmuster ausschließen", nicht "Dateimuster ausschließen".
Liste aller verfügbaren Regeln. Die von golint portierten Regeln bleiben unverändert und in der golint -Spalte angegeben.
| Name | Konfiguration | Beschreibung | golint | Tippt |
|---|---|---|---|---|
context-keys-type | n / A | Achtet die Verwendung grundlegender Typen im context.WithValue . | Ja | Ja |
time-equal | n / A | Schlägt vor == time.Time.Equal != verwenden. | NEIN | Ja |
time-naming | n / A | Konventionen um die Benennung von Zeitvariablen. | Ja | Ja |
unchecked-type-assertions | n / A | Nichts geltend, ohne das Ergebnis zu überprüfen. | NEIN | Ja |
var-declaration | n / A | Reduziert Entlassungen zur variablen Erklärung. | Ja | Ja |
unexported-return | n / A | Warnt, wenn eine öffentliche Rückkehr aus unerpennbarer Art stammt. | Ja | Ja |
errorf | n / A | Sollte errors.New(fmt.Sprintf()) fmt.Errorf() | Ja | Ja |
blank-imports | n / A | Tadelt leere Importe ab | Ja | NEIN |
context-as-argument | n / A | context.Context sollte das erste Argument einer Funktion sein. | Ja | NEIN |
dot-imports | n / A | Verboten . Importe. | Ja | NEIN |
error-return | n / A | Der Fehlerrückgabeparameter sollte zuletzt sein. | Ja | NEIN |
error-strings | [] String | Konventionen um Fehlerzeichenfolgen. | Ja | NEIN |
error-naming | n / A | Benennung von Fehlervariablen. | Ja | NEIN |
exported | [] String | Benennung und Kommentieren von Konventionen zu exportierten Symbolen. | Ja | NEIN |
if-return | n / A | Überflüssig, wenn bei der Rückgabe eines Fehlers. | NEIN | NEIN |
increment-decrement | n / A | Verwenden Sie i++ und i-- anstelle von i += 1 und i -= 1 . | Ja | NEIN |
var-naming | Zulassliste und Blockliste der Initialismen | Namensregeln. | Ja | NEIN |
package-comments | n / A | Paketkommentarkonventionen. | Ja | NEIN |
range | n / A | Verhindert redundante Variablen beim Iterieren einer Sammlung. | Ja | NEIN |
receiver-naming | Karte (optional) | Konventionen um die Benennung von Empfängern. | Ja | NEIN |
indent-error-flow | [] String | Verhindert redundante Aussagen. | Ja | NEIN |
argument-limit | int (Standardeinstellungen bis 8) | Gibt die maximale Anzahl von Argumenten an, die eine Funktion erhalten kann | NEIN | NEIN |
cyclomatic | INT (Standardeinstellungen bis 10) | Legt die Einschränkung für die maximale zyklomatische Komplexität fest. | NEIN | NEIN |
max-public-structs | INT (Standardeinstellungen bis 5) | Die maximale Anzahl öffentlicher Strukturen in einer Datei. | NEIN | NEIN |
file-header | String (Standardeinstellungen bis keine) | Header, die jede Datei haben sollte. | NEIN | NEIN |
empty-block | n / A | Warnt vor leeren Codeblöcken | NEIN | Ja |
superfluous-else | [] String | Verhindert redundante Aussagen (erweitert indent-error-flow ) | NEIN | NEIN |
confusing-naming | n / A | Warnt mit Methoden mit Namen, die nur durch Kapitalisierung unterschiedlich sind | NEIN | NEIN |
get-return | n / A | Warnt Getter, die kein Ergebnis erzielen | NEIN | NEIN |
modifies-parameter | n / A | Warnt über Zuweisungen zu Funktionsparametern | NEIN | NEIN |
confusing-results | n / A | Schlägt vor, potenziell verwirrende Funktionsergebnisse zu benennen | NEIN | NEIN |
deep-exit | n / A | Suchen Sie nach Programmausgängen in anderen Funktionen als main() oder init() | NEIN | NEIN |
unused-parameter | n / A | Schlägt vor, nicht verwendete Funktionsparameter umzubenennen oder zu entfernen | NEIN | NEIN |
unreachable-code | n / A | Warnt vor unerreichbarem Code | NEIN | NEIN |
add-constant | Karte | Schlägt vor, Konstante für magische Zahlen und String -Literale zu verwenden | NEIN | NEIN |
flag-parameter | n / A | Warnt vor Booleschen Parametern, die eine Steuerkopplung erzeugen | NEIN | NEIN |
unnecessary-stmt | n / A | Schlägt vor, unnötige Aussagen zu entfernen oder zu vereinfachen | NEIN | NEIN |
struct-tag | [] String | Überprüft gemeinsame Struktur -Tags wie json , xml , yaml | NEIN | NEIN |
modifies-value-receiver | n / A | Warnt bei Zuordnungen zu Wertmodethovern mit passmännischen Methoden | NEIN | Ja |
constant-logical-expr | n / A | Warnt vor ständigen logischen Ausdrücken | NEIN | NEIN |
bool-literal-in-expr | n / A | Schlägt vor, Boolesche Literale aus logischen Ausdrücken zu entfernen | NEIN | NEIN |
redefines-builtin-id | n / A | Warnt vor Neudefinitionen von baulichen Kennungen | NEIN | NEIN |
function-result-limit | int (Standardeinstellung bis 3) | Gibt die maximale Anzahl von Ergebnissen an, die eine Funktion zurückgeben kann | NEIN | NEIN |
imports-blocklist | [] String | Die Importierung der angegebenen Pakete nicht überträgt | NEIN | NEIN |
range-val-in-closure | n / A | Warnt, ob der Bereichswert in einem als Goroutine versandten Verschluss verwendet wird | NEIN | NEIN |
range-val-address | n / A | Warnt, ob die Adresse des Bereichswertes gefährlich verwendet wird | NEIN | Ja |
waitgroup-by-value | n / A | Warnt vor Funktionen, die Synchronisation einnehmen. | NEIN | NEIN |
atomic | n / A | Überprüfen Sie, ob das sync/atomic häufige falsche Verwendung | NEIN | NEIN |
empty-lines | n / A | Warn | NEIN | NEIN |
line-length-limit | int (Standardeinstellungen bis 80) | Gibt die maximale Anzahl von Zeichen in einer Zeile an | NEIN | NEIN |
call-to-gc | n / A | Warnt vor explizitem Anruf zum Müllsammler | NEIN | NEIN |
duplicated-imports | n / A | Sucht nach Paketen, die zwei oder mehrmals importiert werden | NEIN | NEIN |
import-shadowing | n / A | Spots zu Kennungen, die einen Import beschatten | NEIN | NEIN |
bare-return | n / A | Warnt bei kahlem Renditen | NEIN | NEIN |
unused-receiver | n / A | Schlägt vor, nicht verwendete Methodenempfänger umzubenennen oder zu entfernen | NEIN | NEIN |
unhandled-error | [] String | Warn | NEIN | Ja |
cognitive-complexity | int (Standardeinstellungen bis 7) | Legt die Einschränkung für die maximale kognitive Komplexität fest. | NEIN | NEIN |
string-of-int | n / A | Warn | NEIN | Ja |
string-format | Karte | Warnt vor bestimmten Zeichenfolgenliteralen, die einen oder mehrere von Benutzer konfigurierte reguläre Ausdrücke nicht bestehen | NEIN | NEIN |
early-return | [] String | Flecken if-then-else-Aussagen, bei denen das Prädikat möglicherweise invertiert wird | NEIN | NEIN |
unconditional-recursion | n / A | Warnt über Funktionsaufrufe, die zu einer (direkten) unendlichen Rekursion führen | NEIN | NEIN |
identical-branches | n / A | Spots if-then-else-Aussagen mit identischen then und else Zweigen | NEIN | NEIN |
defer | Karte | Warn | NEIN | NEIN |
unexported-naming | n / A | Warnt auf fälschlich benannte nicht exportierte Symbole | NEIN | NEIN |
function-length | int, int (standardmäßig 50 Anweisungen, 75 Zeilen) | Warnt vor Funktionen, die die Aussagen oder Zeilen maximal überschreiten | NEIN | NEIN |
nested-structs | n / A | Warnt auf Strukturen in Strukturen | NEIN | NEIN |
useless-break | n / A | Warnt vor nutzlosen break -Aussagen für Fallklauseln | NEIN | NEIN |
banned-characters | [] String (Standards zu [] String {}) | Überprüfte verbotene Zeichen in Kennungen | NEIN | NEIN |
optimize-operands-order | n / A | Überprüft ineffiziente bedingte Ausdrücke | NEIN | NEIN |
use-any | n / A | Schlägt vor, interface{} durch ihren any zu ersetzen | NEIN | NEIN |
datarace | n / A | Erfasst potenzielle DataSaraces | NEIN | NEIN |
comment-spacings | [] String | Warnt vor missgebildeten Kommentaren | NEIN | NEIN |
redundant-import-alias | n / A | Warnt vor Import aliase, die mit dem importierten Paketnamen übereinstimmen | NEIN | NEIN |
import-alias-naming | String oder Map [String] String (Standards, um Regex Muster ^[Az] [A-Z0-9] {0,} $) zuzulassen | Konventionen rund um die Benennung von Import -Aliase. | NEIN | NEIN |
enforce-map-style | String (Standardeinstellung zu "Any") | Erzwingt eine konsistente Verwendung von make(map[type]type) oder map[type]type{} für die karteninitialisierung. Wirkt sich nicht auf make(map[type]type, size) Konstruktionen aus. | NEIN | NEIN |
enforce-slice-style | String (Standardeinstellung zu "Any") | Erzwingt die konsistente Verwendung von make([]type, 0) oder []type{} für die Slice -Initialisierung. Wirkt sich nicht auf make(map[type]type, non_zero_len, or_non_zero_cap) aus. | NEIN | NEIN |
enforce-repeated-arg-type-style | String (Standardeinstellung zu "Any") | Erzwingt einen konsistenten Stil für wiederholte Argumentation und/oder Rückgabewerttypen. | NEIN | NEIN |
max-control-nesting | INT (Standardeinstellungen bis 5) | Legt die Beschränkung für die maximale Verschachtelung von Kontrollstrukturen fest. | NEIN | NEIN |
comments-density | int (Standardeinstellung zu 0) | Erzwingt eine minimale Kommentar- / Code -Beziehung | NEIN | NEIN |
file-length-limit | Karte (optional) | Erzwingt eine maximale Anzahl von Zeilen pro Datei | NEIN | NEIN |
filename-format | Regelmäßiger Ausdruck (optional) | Erzwingt die Formatierung von Dateinamen | NEIN | NEIN |
redundant-build-tag | n / A | // +build | NEIN | NEIN |
use-errors-new | n / A | Spotsaufrufe bei fmt.Errorf , die durch errors.New ersetzt werden können.new | NEIN | NEIN |
Hier finden Sie, wie Sie einige vorhandene Regeln konfigurieren können:
var-naming Diese Regel akzeptiert zwei Scheiben von Zeichenfolgen, eine Zulassungsliste und eine Blockliste von Initialismen. Standardmäßig verhält sich die Regel genau wie die Alternative in golint , aber optional können Sie sie entspannen (siehe Golint/Lint/Ausgaben/89).
[ rule . var-naming ]
arguments = [[ " ID " ], [ " VM " ]] Auf diese Weise wird Revive nicht vor einer Kennung namens customId warnen, sondern warnen, dass customVm customVM genannt werden sollte.
In diesem Abschnitt werden alle verfügbaren Formatierungen aufgeführt und für jeden ein Screenshot enthält.


Das Standardformatierer erzeugt die gleiche Ausgabe wie golint .

Das einfache Formatierer erzeugt die gleiche Ausgabe wie das Standardformatierer und findet die URL an die Regelbeschreibung an.

Das Unix -Formatierer erzeugt die gleiche Ausgabe wie das Standardformatierer, umgibt jedoch die Regeln in [] .

Das json -Formatierer erzeugt Output im JSON -Format.
Das ndjson -Formatierer erzeugt die Ausgabe im Newline Delimited JSON -Format.
Das checkstyle Formatierer erzeugt die Ausgabe in einem CheckStyle-ähnlichen Format.
Das sarif Formatierer erzeugt die Ausgabe in SARIF für statische Analyseergebnisse Interchange Format , ein Standard-JSON-basiertes Format für die Ausgabe statischer Analyse-Tools, die durch OASIS definiert und gefördert werden.
Die aktuelle unterstützte Version des Standards ist Sarif-V2.1.0.
Das Tool kann mit benutzerdefinierten Regeln oder Formatierungen erweitert werden. Dieser Abschnitt enthält zusätzliche Informationen zur Implementierung, wie dies implementiert wird.
Um den Linter mit einer benutzerdefinierten Regel zu erweitern, können Sie sie in dieses Repository weitergeben oder revive als Bibliothek verwenden (siehe unten)
Um ein benutzerdefiniertes Formatierer hinzuzufügen, müssen Sie es in dieses Repository weitergeben oder diese aufgeben. Dies ist auf die begrenzte Unterstützung -buildmode=plugin zurückzuführen, die nur unter Linux (mit bekannten Problemen) funktioniert.
Jede Regel muss die Schnittstelle lint.Rule implementieren:
type Rule interface {
Name () string
Apply ( * File , Arguments ) [] Failure
} Der Arguments -Typ ist ein Alias der Typ []interface{} . Die Argumente der Regel werden aus der Konfigurationsdatei übergeben.
Nehmen wir an, wir haben eine Regel namens BanStructNameRule entwickelt, die uns nicht zulässt, eine Struktur mit einer bestimmten Kennung zu benennen. Wir können die verbotene Kennung mithilfe der TOML -Konfigurationsdatei festlegen:
[ rule . ban-struct-name ]
arguments = [ " Foo " ]Mit dem Snippet oben: Wir:
ban-struct-name . Die Methode Name() unserer Regel sollte eine Zeichenfolge zurückgeben, die ban-struct-name entspricht.Foo . Die Liste der Argumente wird zusammen mit der Zieldatei, die wir derzeit verlegen, an Apply(*File, Arguments) übergeben.Eine Beispielregel -Implementierung finden Sie hier.
revive als Bibliothek Wenn eine Regel für Ihren Anwendungsfall spezifisch ist (dh es ist kein guter Kandidat, der zu revive 's Regelsatz hinzugefügt werden kann), können Sie sie mit revive als Lining -Engine zu Ihrem Linter hinzufügen.
Der folgende Code zeigt, wie Sie revive in Ihrer Anwendung verwenden. Im Beispiel wird natürlich nur eine Regel hinzugefügt ( myRule ), Sie können so viele hinzufügen, wie Sie brauchen. Ihre Regeln können programmatisch oder mit der Standard revive -Konfigurationsdatei konfiguriert werden. Der vollständige Regelsatz von revive ist auch von Ihrer Bewerbung umsetzbar.
package main
import (
"github.com/mgechev/revive/cli"
"github.com/mgechev/revive/lint"
"github.com/mgechev/revive/revivelib"
)
func main () {
cli . RunRevive ( revivelib . NewExtraRule ( & myRule {}, lint. RuleConfig {}))
}
type myRule struct {}
func ( f myRule ) Name () string {
return "myRule"
}
func ( f myRule ) Apply ( * lint. File , lint. Arguments ) []lint. Failure { ... } Sie können weiterhin weiter gehen und revive ohne CLI als Teil Ihrer Bibliothek oder Ihrer CLI verwenden:
package mylib
import (
"github.com/mgechev/revive/cli"
"github.com/mgechev/revive/revivelib"
"github.com/mgechev/revive/lint"
)
// Error checking removed for clarity
func LintMyFile ( file string ) {
conf , _ := config . GetConfig ( "../defaults.toml" )
revive , _ := revivelib . New (
conf , // Configuration file
true , // Set exit status
2048 , // Max open files
// Then add as many extra rules as you need
revivelib . NewExtraRule ( & myRule {}, lint. RuleConfig {}),
)
failuresChan , err := revive . Lint (
revivelib . Include ( file ),
revivelib . Exclude ( "./fixtures" ),
// You can use as many revivelib.Include or revivelib.Exclude as required
)
if err != nil {
panic ( "Shouldn't have failed: " + err . Error ())
}
// Now let's return the formatted errors
failures , exitCode , _ := revive . Format ( "stylish" , failuresChan )
// failures is the string with all formatted lint error messages
// exit code is 0 if no errors, 1 if errors (unless config options change it)
// ... do something with them
}
type myRule struct {}
func ( f myRule ) Name () string {
return "myRule"
}
func ( f myRule ) Apply ( * lint. File , lint. Arguments ) []lint. Failure { ... }Jeder Formatierer muss die folgende Schnittstelle implementieren:
type Formatter interface {
Format ( <- chan Failure , Config ) ( string , error )
Name () string
} Die Format akzeptiert einen Kanal von Failure und die Konfiguration der aktivierten Regeln. Die Methode Name() sollte eine andere Zeichenfolge zurückgeben, die sich von den Namen der bereits vorhandenen Regeln unterscheidet. Diese Zeichenfolge wird verwendet, um das Formatierer anzugeben, wenn Sie das revive CLI -Tool aufrufen.
Schauen Sie sich für ein Beispielformatier diese Datei an.
Im Vergleich zu golint führt revive besser ab, da die Dateien für jede einzelne Regel in eine separate Goroutine abgebildet sind. Hier ist ein grundlegender Performance -Benchmark auf MacBook Pro Anfang 2013, der auf Kubernetes ausgeführt wird:
time golint kubernetes/... > /dev/null
real 0m54.837s
user 0m57.844s
sys 0m9.146s # no type checking
time revive -config untyped.toml kubernetes/... > /dev/null
real 0m8.471s
user 0m40.721s
sys 0m3.262s Beachten Sie, dass die Leistung, wenn Sie Regeln verwenden, die Type -Überprüfung erfordern, schneller auf 2x fällt als golint :
# type checking enabled
time revive kubernetes/... > /dev/null
real 0m26.211s
user 2m6.708s
sys 0m17.192sDerzeit ist die Typ-Überprüfung standardmäßig aktiviert. Wenn Sie den Linter ohne Überprüfung des Typs ausführen möchten, entfernen Sie alle typisierten Regeln aus der Konfigurationsdatei.
Standardmäßig bestimmt revive , ob die Ausgabe basierend darauf, ob es mit einem TTY verbunden ist oder nicht, fördern soll oder nicht. Dies funktioniert für die meisten Anwendungsfälle, verhalten sich jedoch möglicherweise nicht wie erwartet, wenn Sie revive in einer Pipeline von Befehlen verwenden, in der STDOut zu einem anderen Befehl geleitet wird.
Um die Farbe zu erzwingen, fügen Sie der Umgebung, in der Sie laufen, REVIVE_FORCE_COLOR=1 hinzu. Zum Beispiel:
REVIVE_FORCE_COLOR=1 revive -formatter friendly ./... | tee revive.log| mgechev | Chavacava | Denisvmedia | Mfederowicz | Xuri | Alexandear |
| ldez | Doniakld | Clivern | Morphy2k | Bernhardreisberger | Dshemin |
| Butuzov | Comdiv | Heynemann | Gsamokovarov | mdelah | Tymonx |
| Sina-devel | RAWEN17 | Dominiquelefevre | Git-Hulk | SHMSR | ytnsym |
| Zimmski | MapReal19 | CCE | Skaji | CCoveille | Tamird |
| Markelog | Mihaitodor | dvejmz | Abeltay | Damif94 | Groxx |
| Stephenbuttolph | Stephenbrown2 | LSYTJ0413 | Qascade | Ridvansumset | rliebz |
| rdeusser | rmarku | rnikoopour | Rafamadriz | PACO0X | pa-m |
| Cinar | Natefinch | Nunnatsa | Michalhisim | Zeripath | y-yagi |
| TechknowloGick | Okhowang | Meanguy | Likyh | Kerneltravel | JMKKENZieark |
| Haya14busa | Frei | Ydah | Willabides | Heyvito | Vincentbaron |
| Scop | vkrol | Kirillsluchaev | Jarema | Tartale | tmzane |
| felipedavid | Euank | Entuazismus | Juneezee | Echoix | Ausweichen |
| Petethepig | Dirk007 | Yangdiangzb | Derekperkins | Bboreham | Attiss |
| Hatamiarash7 | Aragur | Amincheloh | Kulti | Abirdcfly | Abhinav |
| R-Ricci | Mmcloughlin | Mathieu-Aubin | Martinsirbe | Avorima | Moukoublen |
| sehr amüsiert | Johnrichardrinehart | Wände | Jefersonf | JAMESMAUDE | Jalaziz |
| Grongor | binden | Quasilyte | Davidhsingyuchen | Gfariasalves-Ionos | Gburanov |
| Ginglis13 | Flesser |
MIT