Rapide, configurable, extensible, flexible et magnifique pour aller. Remplacement de golint. Revive fournit un cadre pour le développement de règles personnalisées et vous permet de définir un préréglage strict pour améliorer vos processus de développement et d'examen du code .
var-namingrevive comme bibliothèquego install github.com/mgechev/revive@latestou obtenez un exécutable libéré à partir de la page des versions.
Vous pouvez installer la branche principale (y compris le dernier engagement) avec:
go install github.com/mgechev/revive@master Étant donné que le comportement par défaut de revive est compatible avec golint , sans fournir de drapeaux supplémentaires, la seule différence que vous remarqueriez est une exécution plus rapide.
revive prend en charge un indicateur -config dont la valeur doit correspondre à un fichier Toml décrivant les règles à utiliser pour la liaison de revive . S'il n'est pas fourni, revive essaiera d'utiliser un fichier de configuration global (supposé être situé sur $HOME/revive.toml ). Sinon, si aucun fichier Toml de configuration n'est trouvé, revive utilise un ensemble intégré de règles de liaison par défaut.
Un volume doit être monté pour partager le référentiel actuel avec le conteneur. Veuillez vous référer à la documentation Docker Bind Mounts
docker run -v " $( pwd ) " :/var/ < repository > ghcr.io/mgechev/revive:v1.3.7 -config /var/ < repository > /revive.toml -formatter stylish ./var/kidle/...-v est pour le volumeghcr.io/mgechev/revive:v1.3.7 est le nom d'image et sa version correspond à la commande reviveSi vous souhaitez utiliser Revive with Bazel, regardez les règles qu'Atlassian maintient.
Prise en charge de VScode dans VScode-Go.
Prise en charge de Goland via des observateurs de fichiers.
Prise en charge de l'atome via Linter-Revive.
Support pour VIM via l'analyse dense / ALE.
let g: ale_linters = {
' go ' : [ ' revive ' ],
}Prise en charge de Neovim via null-LS.NVIM.
require ( " null-ls " ). setup ({
sources = {
require ( " null-ls " ). builtins . diagnostics . revive
},
})Codeac.io - Le service de révision de code automatisé s'intègre à GitHub, Bitbucket et GitLab (même auto-hébergé) et vous aide à lutter contre la dette technique. Vérifiez automatiquement vos refontes de traction avec réviser. (GRATUIT pour les projets open source)
Pour permettre revive dans golangci-lint vous devez ajouter revive à la liste des litters activés:
# golangci-lint configuration file
linters :
enable :
- revive Ensuite, revive peut être configuré en ajoutant une entrée à la section linters-settings de la configuration, par exemple:
# 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"] La configuration ci-dessus permet à trois règles de revive : atomique , ligne de ligne de ligne et erreurs non perdue et transmettre quelques arguments aux deux derniers. La section de configuration de ce document fournit des détails sur la façon de configurer revive . Notez que bien que la configuration revive soit dans Toml, celle de golangci-lint est dans YAML.
Veuillez noter que si aucune configuration particulière n'est fournie, revive se comportera comme le fait go-lint , c'est-à-dire que toutes les règles go-lint sont activées (les règles disponibles détaillent quelles sont les règles go-lint ). Lorsqu'une configuration est fournie, seules les règles de la configuration sont activées.
revive accepte les paramètres de ligne de commande suivants:
-config [PATH] - Chemin vers le fichier de configuration au format Toml, par défaut à $HOME/revive.toml s'il est présent.
-exclude [PATTERN] - modèle pour les fichiers / répertoires / packages à exclure pour la liaison. Vous pouvez spécifier les fichiers que vous souhaitez exclure pour la libellur comme le nom du package (c'est-à-dire github.com/mgechev/revive ), les énumrer comme fichiers individuels (c'est-à-dire file.go ), les répertoires (ie ./foo/... ), ou toute combinaison des trois. Si aucun modèle d'exclusion n'est spécifié, vendor/... sera exclu par défaut.
-formatter [NAME] - Formateur à utiliser pour la sortie. Les formateurs actuellement disponibles sont:
default - publiera les échecs de la même manière que golint .json - Sorte les échecs au format JSON.ndjson - Sorte les échecs en tant que flux au format JSON (NDJSON) délimité de nouvelles lignes.friendly - produit les échecs lorsqu'ils sont trouvés. Montre le résumé de tous les échecs.stylish - Formats les échecs dans une table. Gardez à l'esprit qu'il ne diffuse pas la sortie, il peut donc être perçu comme plus lent par rapport aux autres.checkstyle - sortit les échecs au format XML compatibles avec celui de CheckStyle de Java. -max_open_files - Nombre maximum de fichiers ouverts en même temps. Par défaut est illimité.
-set_exit_status - Définissez l'état de sortie sur 1 Si des problèmes sont trouvés, écrasent errorCode et warningCode dans Config.
-version - Get Revive Version.
revive -config revive.toml -exclude file1.go -exclude file2.go -formatter friendly github.com/mgechev/revive package/...revive.tomlrevive ignorera file1.go et file2.gofriendlygithub.com/mgechev/revive et les fichiers dans packageEn utilisant les commentaires, vous pouvez désactiver le linter pour l'ensemble du fichier ou seulement une gamme de lignes:
//revive:disable
func Public () {}
//revive:enable L'extrait ci-dessus, désactivera revive entre la revive:disable and revive:enable les commentaires. Si vous sautez revive:enable , le linter sera désactivé pour le reste du fichier.
Avec revive:disable-next-line et revive:disable-line vous pouvez désactiver revive sur une ligne de code particulière.
Vous pouvez faire de même au niveau des règles. Dans le cas où vous souhaitez désactiver une règle particulière, vous pouvez utiliser:
//revive:disable:unexported-return
func Public () private {
return private
}
//revive:enable:unexported-return De cette façon, revive ne vous avertira pas que vous renvoyez un objet d'un type non conforme, à partir d'une fonction exportée.
Vous pouvez documenter pourquoi vous désactivez le linter en ajoutant un texte traîné dans la directive, par exemple
//revive:disable Until the code is stable //revive:disable:cyclomatic High complexity score but easy to understand Vous pouvez également configurer revive pour appliquer les directives de désactivation de Linter en ajoutant
[ directive . specify-disable-reason ]dans la configuration. Vous pouvez définir la gravité (par défaut sur l'avertissement ) de la violation de cette directive
[ directive . specify-disable-reason ]
severity = " error " revive peut être configuré avec un fichier Toml. Voici un exemple de configuration avec une explication des propriétés individuelles:
# 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 " Par défaut, revive permettra uniquement les règles de liaison qui sont nommées dans le fichier de configuration. Par exemple, le fichier de configuration précédent fait revive pour activer uniquement les règles cyclomatiques et les comment de package .
Pour activer toutes les règles disponibles, vous devez ajouter:
enableAllRules = trueCela permettra à toutes les règles disponibles, quelles que soient les règles nommées dans le fichier de configuration.
Pour désactiver une règle, vous le marquez simplement comme désactivé dans la configuration. Par exemple:
[ rule . line-length-limit ]
Disabled = trueLors de l'activation de toutes les règles, vous avez encore besoin / Vous pouvez fournir des configurations spécifiques pour les règles. Le fichier suivant est un exemple de configuration où toutes les règles sont activées, à l'exception de ceux qui sont explicitement désactivés, et certaines règles sont configurées avec des arguments particuliers:
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 " ] La configuration par défaut de revive peut être trouvée sur defaults.toml . Cela permettra toutes les règles disponibles dans golint et utilisera leur configuration par défaut (c'est-à-dire la façon dont ils sont codés en dur à golint ).
revive -config defaults.toml github.com/mgechev/revive Cela utilisera le fichier de configuration defaults.toml , le formateur default , et s'exécutera sur le package github.com/mgechev/revive .
revive -config config.toml -formatter friendly github.com/mgechev/revive Cela utilisera config.toml , le formateur friendly , et exécutera le libellé sur le package github.com/mgechev/revive .
L'extrait suivant contient la configuration revive recommandée que vous pouvez utiliser dans votre projet:
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 ]Vous pouvez également configurer les exclusions personnalisées pour chaque règle.
C'est une alternative pour le programme mondial -exclude 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 " ]Vous pouvez utiliser les modèles d'exclusion suivants
src/pkg/mypkg/some.gosrc/**/*.pb.go~.(pb|auto|generated).go$TEST bien connu (identique à **/*_test.go )* et ~ Les modèles excluent tous les fichiers (même effet que la désactivation de la règle) b. Le modèle "" (vide) exclut rienRemarque: ne gâchez pas
excludequi peut être utilisée au niveau supérieur du fichier Toml, cela signifie "exclure les modèles de package", et non "exclure les modèles de fichiers"
Liste de toutes les règles disponibles. Les règles portées par golint sont restées inchangées et indiquées dans la colonne golint .
| Nom | Configurer | Description | golint | Dactylographié |
|---|---|---|---|---|
context-keys-type | n / A | Interdit l'utilisation des types de base dans context.WithValue . | Oui | Oui |
time-equal | n / A | Suggère d'utiliser time.Time.Equal au lieu de == et != Pour le temps de contrôle de l'égalité. | Non | Oui |
time-naming | n / A | Conventions autour de la dénomination des variables temporelles. | Oui | Oui |
unchecked-type-assertions | n / A | Désactivez les assertions de type sans vérifier le résultat. | Non | Oui |
var-declaration | n / A | Réduit les redondances autour de la déclaration variable. | Oui | Oui |
unexported-return | n / A | Met en garde lorsqu'un retour public est de type non approuvé. | Oui | Oui |
errorf | n / A | Devrait remplacer errors.New(fmt.Sprintf()) par fmt.Errorf() | Oui | Oui |
blank-imports | n / A | Interdit les importations vierges | Oui | Non |
context-as-argument | n / A | context.Context devrait être le premier argument d'une fonction. | Oui | Non |
dot-imports | n / A | Interdit . importations. | Oui | Non |
error-return | n / A | Le paramètre de retour d'erreur doit être le dernier. | Oui | Non |
error-strings | []chaîne | Conventions autour des chaînes d'erreur. | Oui | Non |
error-naming | n / A | Dénomination des variables d'erreur. | Oui | Non |
exported | []chaîne | Nommer et commenter les conventions sur les symboles exportés. | Oui | Non |
if-return | n / A | Redondant si lors du retour d'une erreur. | Non | Non |
increment-decrement | n / A | Utilisez i++ et i-- au lieu de i += 1 et i -= 1 . | Oui | Non |
var-naming | ALLERDLIST & BLOCKLIST des initialismes | Nommer les règles. | Oui | Non |
package-comments | n / A | Package des conventions de commentaires. | Oui | Non |
range | n / A | Empêche les variables redondantes lors de l'itération d'une collection. | Oui | Non |
receiver-naming | Carte (facultative) | Conventions autour de la dénomination des récepteurs. | Oui | Non |
indent-error-flow | []chaîne | Empêche les déclarations redondantes d'autre. | Oui | Non |
argument-limit | int (par défaut à 8) | Spécifie le nombre maximum d'arguments qu'une fonction peut recevoir | Non | Non |
cyclomatic | int (par défaut à 10) | Établit une restriction pour une complexité cyclomatique maximale. | Non | Non |
max-public-structs | int (par défaut à 5) | Le nombre maximum de structures publiques dans un fichier. | Non | Non |
file-header | String (par défaut à aucun) | En-tête que chaque fichier devrait avoir. | Non | Non |
empty-block | n / A | Avertit les blocs de code vides | Non | Oui |
superfluous-else | []chaîne | Empêche les déclarations redondantes Else (étend indent-error-flow ) | Non | Non |
confusing-naming | n / A | Met en garde contre les méthodes avec des noms qui ne diffèrent que par la capitalisation | Non | Non |
get-return | n / A | Met en garde contre les getters qui ne donnent aucun résultat | Non | Non |
modifies-parameter | n / A | Avertit les affectations aux paramètres de fonction | Non | Non |
confusing-results | n / A | Suggère de nommer des résultats de fonction potentiellement confus | Non | Non |
deep-exit | n / A | Recherche des sorties du programme dans des funcs autres que main() ou init() | Non | Non |
unused-parameter | n / A | Suggère de renommer ou de supprimer les paramètres de fonction inutilisés | Non | Non |
unreachable-code | n / A | Met en garde contre le code inaccessible | Non | Non |
add-constant | carte | Suggère d'utiliser constant des nombres magiques et des littéraux de cordes | Non | Non |
flag-parameter | n / A | Met en garde contre les paramètres booléens qui créent un couplage de contrôle | Non | Non |
unnecessary-stmt | n / A | Suggère de supprimer ou de simplifier les déclarations inutiles | Non | Non |
struct-tag | []chaîne | Vérifie les balises de structure communes comme json , xml , yaml | Non | Non |
modifies-value-receiver | n / A | Avertit les affectations aux récepteurs de méthode adoptés par valeur | Non | Oui |
constant-logical-expr | n / A | Met en garde contre les expressions logiques constantes | Non | Non |
bool-literal-in-expr | n / A | Suggère de supprimer les littéraux booléens des expressions logiques | Non | Non |
redefines-builtin-id | n / A | Met en garde contre les redéfinitions des identifiants intégrés | Non | Non |
function-result-limit | int (par défaut est 3) | Spécifie le nombre maximum de résultats qu'une fonction peut renvoyer | Non | Non |
imports-blocklist | []chaîne | Interdit l'importation des packages spécifiés | Non | Non |
range-val-in-closure | n / A | Avertit si la valeur de plage est utilisée dans une fermeture envoyée comme goroutine | Non | Non |
range-val-address | n / A | Prévient si l'adresse de la valeur de la plage est utilisée dangereusement | Non | Oui |
waitgroup-by-value | n / A | Avertit les fonctions prenant Sync.WaitGroup en tant que paramètre par valeur | Non | Non |
atomic | n / A | Vérifiez les usages erronés courants du package sync/atomic | Non | Non |
empty-lines | n / A | Avertit quand il y a des lignes de tête ou de traîne dans un bloc | Non | Non |
line-length-limit | int (par défaut à 80) | Spécifie le nombre maximum de caractères dans une ligne | Non | Non |
call-to-gc | n / A | Met en garde contre l'appel explicite au collecteur des ordures | Non | Non |
duplicated-imports | n / A | Recherche des packages importés deux fois ou plus | Non | Non |
import-shadowing | n / A | Spotts identificateurs qui ombragèrent une importation | Non | Non |
bare-return | n / A | Met en garde contre les retours nus | Non | Non |
unused-receiver | n / A | Suggère de renommer ou de supprimer les récepteurs de méthode inutilisés | Non | Non |
unhandled-error | []chaîne | Met en garde contre les erreurs non gérées renvoyées par les appels de fonction | Non | Oui |
cognitive-complexity | int (par défaut à 7) | Établit une restriction pour une complexité cognitive maximale. | Non | Non |
string-of-int | n / A | Avertit les moulages suspects de l'int à la chaîne | Non | Oui |
string-format | carte | Met en garde contre des littéraux de cordes spécifiques qui échouent une ou plusieurs expressions régulières configurées par l'utilisateur | Non | Non |
early-return | []chaîne | Permet les déclarations si-then-else où le prédicat peut être inversé pour réduire la nidification | Non | Non |
unconditional-recursion | n / A | Met en garde contre les appels de fonction qui conduiront à une récursivité infinie (directe) | Non | Non |
identical-branches | n / A | Place les déclarations si-then-else avec des branches identiques then et else | Non | Non |
defer | carte | Met en garde contre certains gatchas de différence | Non | Non |
unexported-naming | n / A | Met en garde contre les symboles non exportés à tort | Non | Non |
function-length | int, int (par défaut à 50 instructions, 75 lignes) | Met en garde contre les fonctions dépassant les instructions ou les lignes max | Non | Non |
nested-structs | n / A | Met en garde contre les structures dans les structures | Non | Non |
useless-break | n / A | Prévient les déclarations break inutiles dans les clauses du cas | Non | Non |
banned-characters | [] String (par défaut à [] String {}) | Vérifie les personnages interdits dans les identifiants | Non | Non |
optimize-operands-order | n / A | Vérifie les expressions conditionnelles inefficaces | Non | Non |
use-any | n / A | Propose de remplacer interface{} par son any | Non | Non |
datarace | n / A | Permet les données potentielles des données potentielles | Non | Non |
comment-spacings | []chaîne | Met en garde contre les commentaires malformés | Non | Non |
redundant-import-alias | n / A | Met en garde contre les alias d'importation correspondant au nom du package importé | Non | Non |
import-alias-naming | String ou map [String] String (par défaut pour permettre le modèle regex ^ [az] [A-Z0-9] {0,} $) | Conventions autour de la dénomination des alias d'importation. | Non | Non |
enforce-map-style | chaîne (par défaut est "n'importe quel") | Applique une utilisation cohérente de make(map[type]type) ou map[type]type{} pour l'initialisation de la carte. N'affecte pas les constructions make(map[type]type, size) . | Non | Non |
enforce-slice-style | chaîne (par défaut est "n'importe quel") | Applique une utilisation cohérente du make([]type, 0) ou []type{} pour l'initialisation de la tranche. N'affecte pas make(map[type]type, non_zero_len, or_non_zero_cap) . | Non | Non |
enforce-repeated-arg-type-style | chaîne (par défaut est "n'importe quel") | Applique un style cohérent pour les types d'arguments et / ou de valeur de retour répétés. | Non | Non |
max-control-nesting | int (par défaut à 5) | Définit la restriction de la nidification maximale des structures de contrôle. | Non | Non |
comments-density | int (par défaut à 0) | Applique une relation de commentaire / code minimum | Non | Non |
file-length-limit | Carte (facultative) | Applique un nombre maximum de lignes par fichier | Non | Non |
filename-format | Expression régulière (facultative) | Applique le formatage des noms de fichiers | Non | Non |
redundant-build-tag | n / A | Met en garde contre les lignes de commentaires redondantes // +build | Non | Non |
use-errors-new | n / A | Spotts appelle fmt.Errorf qui peut être remplacé par errors.New | Non | Non |
Ici, vous pouvez trouver comment vous pouvez configurer certaines règles existantes:
var-naming Cette règle accepte deux tranches de chaînes, une liste d'autoroute et une liste de blocs d'initialismes. Par défaut, la règle se comporte exactement comme l'alternative à golint mais éventuellement, vous pouvez la détendre (voir Golint / Lint / Issues / 89)
[ rule . var-naming ]
arguments = [[ " ID " ], [ " VM " ]] De cette façon, Revive n'arrivera pas un identifiant appelé customId mais avertira que customVm devrait être appelé customVM .
Cette section répertorie tous les formateurs disponibles et fournit une capture d'écran pour chacun.


Le formateur par défaut produit la même sortie que golint .

Le formateur simple produit la même sortie que le formateur par défaut et ajoute l'URL à la description de la règle.

Le formateur Unix produit la même sortie que le formateur par défaut mais entoure les règles dans [] .

Le formateur json produit une sortie au format JSON.
Le formateur ndjson produit une sortie au format Newline Delimited JSON .
Le formateur de contrôle checkstyle produit la sortie dans un format de type CheckStyle.
Le formateur sarif produit la sortie dans Sarif, pour les résultats des résultats de l'analyse statique, un format d'échange , un format basé sur JSON standard pour la sortie des outils d'analyse statique définis et promus par Oasis.
La version actuelle prise en charge de la norme est Sarif-V2.1.0.
L'outil peut être étendu avec des règles ou des formateurs personnalisés. Cette section contient des informations supplémentaires sur la façon de mettre en œuvre telle.
Pour étendre le linter avec une règle personnalisée, vous pouvez le pousser vers ce référentiel ou utiliser revive comme bibliothèque (voir ci-dessous)
Pour ajouter un formateur personnalisé, vous devrez le pousser vers ce référentiel ou le fourrer. Cela est dû au support limité -buildmode=plugin qui ne fonctionne que sur Linux (avec des problèmes connus).
Chaque règle doit implémenter l'interface lint.Rule :
type Rule interface {
Name () string
Apply ( * File , Arguments ) [] Failure
} Le type Arguments est un alias de l' []interface{} . Les arguments de la règle sont adoptés du fichier de configuration.
Supposons que nous ayons développé une règle appelée BanStructNameRule qui nous interdit de nommer une structure avec un identifiant donné. Nous pouvons définir l'identifiant interdit en utilisant le fichier de configuration Toml:
[ rule . ban-struct-name ]
arguments = [ " Foo " ]Avec l'extrait au-dessus de nous:
ban-struct-name . La méthode Name() de notre règle doit renvoyer une chaîne qui correspond à ban-struct-name .Foo . La liste des arguments sera adoptée pour Apply(*File, Arguments) ainsi que le fichier cible que nous libelons actuellement.Un exemple de mise en œuvre de règles peut être trouvé ici.
revive comme bibliothèque Si une règle est spécifique à votre cas d'utilisation (c'est-à-dire que ce n'est pas un bon candidat à ajouter à l'ensemble de règles de revive ), vous pouvez l'ajouter à votre linter en utilisant revive comme moteur de liaison.
Le code suivant montre comment utiliser revive dans votre application. Dans l'exemple, une seule règle est ajoutée ( myRule ), bien sûr, vous pouvez en ajouter autant que vous en avez. Vos règles peuvent être configurées par programmation ou avec le fichier de configuration revive standard. L'ensemble de règles complet de revive est également exploitable par votre demande.
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 { ... } Vous pouvez toujours aller plus loin et utiliser revive sans sa CLI, dans le cadre de votre bibliothèque, ou de votre CLI:
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 { ... }Chaque formateur doit implémenter l'interface suivante:
type Formatter interface {
Format ( <- chan Failure , Config ) ( string , error )
Name () string
} La méthode Format accepte un canal d'instances Failure et la configuration des règles activées. La méthode Name() doit renvoyer une chaîne différente des noms des règles déjà existantes. Cette chaîne est utilisée lors de la spécification du formateur lors de l'invocation de l'outil revive CLI.
Pour un exemple de formateur, jetez un œil à ce fichier.
Par rapport à golint , revive fonctionne mieux car il peint les fichiers pour chaque règle individuelle dans un goroutine distinct. Voici une référence de base des performances sur MacBook Pro début 2013 sur Kubernetes:
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 Gardez à l'esprit que si vous utilisez des règles qui nécessitent une vérification de type, les performances peuvent chuter à 2x plus rapidement que golint :
# type checking enabled
time revive kubernetes/... > /dev/null
real 0m26.211s
user 2m6.708s
sys 0m17.192sActuellement, la vérification du type est activée par défaut. Si vous souhaitez exécuter le linter sans vérification de type, supprimez toutes les règles typées du fichier de configuration.
Par défaut, revive détermine s'il a ou non coloré sa sortie en fonction de son connexion ou non. Cela fonctionne pour la plupart des cas d'utilisation, mais peut ne pas se comporter comme prévu si vous utilisez revive dans un pipeline de commandes, où STDOUT est en cours de tuyau d'une autre commande.
Pour forcer la colorisation, ajoutez REVIVE_FORCE_COLOR=1 à l'environnement dans lequel vous utilisez. Par exemple:
REVIVE_FORCE_COLOR=1 revive -formatter friendly ./... | tee revive.log| mgechev | chavacava | Denisvmedia | mfederowicz | Xuri | Alexandear |
| Ldez | Doniacld | Clivern | morphy2k | Bernhardreisenberger | dshemin |
| Butuzov | comdiv | heynemann | gsamokovarov | mdelah | tymonx |
| sina-devel | Rawen17 | Domiquelefevre | git-houc | shmsr | ytnsym |
| zimmski | mapreal19 | cce | skaji | ccoveille | taminer |
| markelog | mihaitodor | dvejmz | aboutissage | damif94 | Groxx |
| Stephenbuttolph | Stephenbrown2 | LSYTJ0413 | qascade | ridvansumset | rliebz |
| rdeusser | rmarku | rnikoopour | rafamadriz | paco0x | pa-m |
| Cinar | natefinch | nunnatsa | Michalhisim | zeripath | y-yagi |
| TechKnowlogick | okhowang | égale | likyh | kerneltravel | jmckenzieark |
| haya14busa | frein | ydah | Sauleurs | heyvito | Vincentbaron |
| foulard | vkrol | Kirillsluchaev | Jarema | tartale | tmzane |
| félipedavid | euank | Intuazisme | Juneeze | résonner | Exhatives |
| pettepig | Dirk007 | yangdiangzb | derekperkins | bboreham | attis |
| hatamiarash7 | Aragur | amincheloh | kulti | Abirdcfly | abhinav |
| R-RICCI | mmcloughlin | Mathieu-Aubin | Martinsirbe | avorima | écume |
| très amuré | Johnrichardrinehart | murs | jefersonf | Jamesmaid | jalaziz |
| grongor | cravate | quasilyte | Davidhsingyuchen | gfariasalves-ionos | Gburanov |
| ginglis13 | éclater |
Mit