Rápido, configurable, extensible, flexible y hermoso Linter para Go. Reemplazo de Golint. Revive proporciona un marco para el desarrollo de reglas personalizadas y le permite definir un estricto preajuste para mejorar sus procesos de desarrollo y revisión de código .
var-namingrevive como una bibliotecago install github.com/mgechev/revive@latesto obtener un ejecutable liberado de la página de versiones.
Puede instalar la rama principal (incluida la última confirmación) con:
go install github.com/mgechev/revive@master Dado que el comportamiento predeterminado de revive es compatible con golint , sin proporcionar indicadores adicionales, la única diferencia que notaría es una ejecución más rápida.
revive admite un indicador -config cuyo valor debe corresponder a un archivo TOML que describe qué reglas usar para la pelusa de revive . Si no se proporciona, revive intentará usar un archivo de configuración global (se supone que está ubicado en $HOME/revive.toml ). De lo contrario, si no se encuentra ningún archivo Toml de configuración, revive utiliza un conjunto incorporado de reglas de pelusa predeterminadas.
Se debe montar un volumen para compartir el repositorio actual con el contenedor. Consulte la documentación de Docker de montura de enlace de enlace
docker run -v " $( pwd ) " :/var/ < repository > ghcr.io/mgechev/revive:v1.3.7 -config /var/ < repository > /revive.toml -formatter stylish ./var/kidle/...-v es para el volumenghcr.io/mgechev/revive:v1.3.7 es el nombre de la imagen y su versión corresponde al comando reviveSi desea usar Revive con Bazel, mire las reglas que Atlassian mantiene.
Soporte para VScode en VScode-go.
Soporte para Goland a través de los observadores de archivos.
Soporte para Atom a través de la revisión de Línter.
Soporte para VIM a través del análisis denso/ALE.
let g: ale_linters = {
' go ' : [ ' revive ' ],
}Soporte para Neovim a través de NULL-LS.NVIM.
require ( " null-ls " ). setup ({
sources = {
require ( " null-ls " ). builtins . diagnostics . revive
},
})CODEAC.IO - El servicio automatizado de revisión de código se integra con GitHub, Bitbucket y Gitlab (incluso autohostado) y te ayuda a combatir la deuda técnica. Verifique sus solicitudes de extracción con Revive automáticamente. (gratis para proyectos de código abierto)
Para habilitar revive in golangci-lint debe agregar revive a la lista de linters habilitados:
# golangci-lint configuration file
linters :
enable :
- revive Luego, revive se puede configurar agregando una entrada a la sección linters-settings de la configuración, por ejemplo:
# 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 configuración anterior permite tres reglas de revive : Atomic , Line-Long-Limit y Undhandled-Error y pasar algunos argumentos a los dos últimos. La sección de configuración de este documento proporciona detalles sobre cómo configurar revive . Tenga en cuenta que si bien la configuración revive está en TOML, la de golangci-lint está en YAML.
Tenga en cuenta que si no se proporciona una configuración en particular, revive se comportará como lo hace go-lint , es decir, todas las reglas de go-lint están habilitados (las reglas disponibles detalla cuáles son las reglas de go-lint ). Cuando se proporciona una configuración, solo las reglas en la configuración están habilitadas.
revive acepta los siguientes parámetros de línea de comando:
-config [PATH] - ruta al archivo de configuración en formato Toml, predeterminado a $HOME/revive.toml si está presente.
-exclude [PATTERN] - Patrón para archivos/directorios/paquetes que se excluirán para la pelusa. Puede especificar los archivos que desea excluir para la línea de pelucas como nombre del paquete (es decir, github.com/mgechev/revive ), enumerarlos como archivos individuales (es decir, file.go ), directorios (es decir, ./foo/... ) o cualquier combinación de los tres. Si no se especifican patrones de exclusión, vendor/... se excluirá de forma predeterminada.
-formatter [NAME] - Formatero que se utilizará para la salida. Los formateros disponibles actualmente son:
default : emitirá las fallas de la misma manera que lo hace golint .json : emite las fallas en formato JSON.ndjson : emite las fallas como flujo en formato JSON (NDJSON) delimitado de Newline.friendly : emite las fallas cuando se encuentran. Muestra el resumen de todos los fracasos.stylish : formatea las fallas en una mesa. Tenga en cuenta que no transmite la salida, por lo que podría percibirse como más lento en comparación con los demás.checkstyle : emite las fallas en formato XML compatible con el del estilo de checkStyle de Java. -max_open_files - número máximo de archivos abiertos al mismo tiempo. El valor predeterminado a ilimitado.
-set_exit_status : establezca el estado de salida en 1 si se encuentran problemas, sobrescribe errorCode y warningCode en config.
-version - Obtener la versión Revive.
revive -config revive.toml -exclude file1.go -exclude file2.go -formatter friendly github.com/mgechev/revive package/...revive.tomlrevive ignorará file1.go y file2.gofriendlygithub.com/mgechev/revive y los archivos en packageUsando comentarios, puede deshabilitar el enlace para todo el archivo o solo una gama de líneas:
//revive:disable
func Public () {}
//revive:enable El fragmento anterior, deshabilitará revive entre revive:disable y revive:enable comentarios. Si omite revive:enable , el enlace se deshabilitará para el resto del archivo.
Con revive:disable-next-line y revive:disable-line puede deshabilitar revive en una línea de código particular.
Puedes hacer lo mismo en un nivel de regla. En caso de que desee deshabilitar solo una regla en particular, puede usar:
//revive:disable:unexported-return
func Public () private {
return private
}
//revive:enable:unexported-return De esta manera, revive no le advertirá que está devolviendo un objeto de un tipo no exportado, desde una función exportada.
Puede documentar por qué deshabilita el Linter agregando un texto de salida en la Directiva, por ejemplo.
//revive:disable Until the code is stable //revive:disable:cyclomatic High complexity score but easy to understand También puede configurar revive para hacer cumplir la documentación de las directivas de discapacidad de la intermedia al agregar
[ directive . specify-disable-reason ]en la configuración. Puede establecer la gravedad (predeterminado se advierte ) de la violación de esta directiva
[ directive . specify-disable-reason ]
severity = " error " revive se puede configurar con un archivo Toml. Aquí hay una configuración de muestra con una explicación de las propiedades individuales:
# 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 " De forma predeterminada, revive habilitará solo las reglas de pelusa que se nombran en el archivo de configuración. Por ejemplo, el archivo de configuración anterior hace revive para habilitar solo reglas de pelusa ciclomáticas y de paquetes .
Para habilitar todas las reglas disponibles que debe agregar:
enableAllRules = trueEsto habilitará todas las reglas disponibles sin importar qué reglas se denominen en el archivo de configuración.
Para deshabilitar una regla, simplemente lo marque como deshabilitado en la configuración. Por ejemplo:
[ rule . line-length-limit ]
Disabled = trueAl habilitar todas las reglas que aún necesita/puede proporcionar configuraciones específicas para las reglas. El siguiente archivo es una configuración de ejemplo donde todas las reglas están habilitadas, excepto las que están desactivadas explícitamente, y algunas reglas están configuradas con argumentos particulares:
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 configuración predeterminada de revive se puede encontrar en defaults.toml . Esto permitirá todas las reglas disponibles en golint y usará su configuración predeterminada (es decir, la forma en que están codificadas en golint ).
revive -config defaults.toml github.com/mgechev/revive Esto utilizará el archivo de configuración defaults.toml , el formateador default , y se ejecutará pelucas a través del paquete github.com/mgechev/revive .
revive -config config.toml -formatter friendly github.com/mgechev/revive Esto utilizará config.toml , el formateador friendly y se ejecutará pelucas a través del paquete github.com/mgechev/revive .
El siguiente fragmento contiene la configuración revive recomendada que puede usar en su proyecto:
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 ]También puede configurar las exclusiones personalizadas para cada regla.
Es una alternativa para el programa Global -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 " ]Puedes usar los siguientes patrones de exclusión
src/pkg/mypkg/some.gosrc/**/*.pb.go~.(pb|auto|generated).go$TEST bien conocida (igual que **/*_test.go )* y ~ Los patrones excluyen todos los archivos (el mismo efecto que deshabilitar la regla) b. "" (vacío) patrón no excluye nadaNota: No te metas con
excludeque se puede usar en el nivel superior del archivo Toml, eso significa "excluir patrones de paquetes", no "excluir patrones de archivo"
Lista de todas las reglas disponibles. Las reglas portadas por golint se dejan sin cambios e indicadas en la columna golint .
| Nombre | Configuración | Descripción | golint | Escrito |
|---|---|---|---|---|
context-keys-type | n / A | No permite el uso de tipos básicos en context.WithValue . | Sí | Sí |
time-equal | n / A | Sugiere usar time.Time.Equal en lugar de == y != Para el tiempo de verificación de igualdad. | No | Sí |
time-naming | n / A | Convenciones sobre el nombramiento de las variables de tiempo. | Sí | Sí |
unchecked-type-assertions | n / A | No permitir las afirmaciones de tipo sin verificar el resultado. | No | Sí |
var-declaration | n / A | Reduce redundancias en torno a la declaración variable. | Sí | Sí |
unexported-return | n / A | Advierte cuándo una devolución pública es de tipo no exportado. | Sí | Sí |
errorf | n / A | Debe reemplazar errors.New(fmt.Sprintf()) con fmt.Errorf() | Sí | Sí |
blank-imports | n / A | No permite las importaciones en blanco | Sí | No |
context-as-argument | n / A | context.Context debe ser el primer argumento de una función. | Sí | No |
dot-imports | n / A | Prohíbe . importaciones. | Sí | No |
error-return | n / A | El parámetro de retorno de error debe ser el último. | Sí | No |
error-strings | []cadena | Convenciones alrededor de las cadenas de error. | Sí | No |
error-naming | n / A | Naming de variables de error. | Sí | No |
exported | []cadena | Nombrar y comentar convenciones sobre símbolos exportados. | Sí | No |
if-return | n / A | Redundante si al devolver un error. | No | No |
increment-decrement | n / A | Use i++ e i-- en lugar de i += 1 e i -= 1 . | Sí | No |
var-naming | Listista y lista de bloques de inicialismos | Reglas de nombres. | Sí | No |
package-comments | n / A | Convenciones de comentarios de paquete. | Sí | No |
range | n / A | Previene variables redundantes al iterar sobre una colección. | Sí | No |
receiver-naming | Mapa (opcional) | Convenciones en torno al nombramiento de receptores. | Sí | No |
indent-error-flow | []cadena | Evita declaraciones redundantes de else. | Sí | No |
argument-limit | int (predeterminado es 8) | Especifica el número máximo de argumentos que una función puede recibir | No | No |
cyclomatic | int (predeterminado es a 10) | Establece restricción para la máxima complejidad ciclomática. | No | No |
max-public-structs | int (predeterminado es a 5) | El número máximo de estructuras públicas en un archivo. | No | No |
file-header | cadena (predeterminada a ninguno) | Encabezado que debe tener cada archivo. | No | No |
empty-block | n / A | Advierte en bloques de código vacíos | No | Sí |
superfluous-else | []cadena | Previene las declaraciones redundantes de else (se extiende indent-error-flow ) | No | No |
confusing-naming | n / A | Advierte sobre métodos con nombres que difieren solo por capitalización | No | No |
get-return | n / A | Advierte sobre Getters que no producen ningún resultado | No | No |
modifies-parameter | n / A | Advierte sobre las tareas a los parámetros de función | No | No |
confusing-results | n / A | Sugiere nombrar resultados de función potencialmente confusos | No | No |
deep-exit | n / A | Busca salidas del programa en funcs distintos de main() o init() | No | No |
unused-parameter | n / A | Sugiere cambiar el nombre o eliminar los parámetros de la función no utilizada | No | No |
unreachable-code | n / A | Advierte sobre un código inalcanzable | No | No |
add-constant | mapa | Sugiere usar constantes para números mágicos y literales de cadena | No | No |
flag-parameter | n / A | Advierte sobre los parámetros booleanos que crean un acoplamiento de control | No | No |
unnecessary-stmt | n / A | Sugiere eliminar o simplificar las declaraciones innecesarias | No | No |
struct-tag | []cadena | Verifica etiquetas de estructura comunes como json , xml , yaml | No | No |
modifies-value-receiver | n / A | Advierte sobre las asignaciones a los receptores de métodos superados por valor | No | Sí |
constant-logical-expr | n / A | Advierte sobre expresiones lógicas constantes | No | No |
bool-literal-in-expr | n / A | Sugiere eliminar literales booleanos de expresiones lógicas | No | No |
redefines-builtin-id | n / A | Advierte sobre redefiniciones de identificadores construidos | No | No |
function-result-limit | int (predeterminado es 3) | Especifica el número máximo de resultados que una función puede devolver | No | No |
imports-blocklist | []cadena | No permitir la importación de los paquetes especificados | No | No |
range-val-in-closure | n / A | Advierte si el valor de rango se usa en un cierre enviado como Goroutine | No | No |
range-val-address | n / A | Advierte si la dirección del valor de rango se usa peligrosamente | No | Sí |
waitgroup-by-value | n / A | Advierte sobre las funciones que toman sync.waitgroup como parámetro de valor parcial | No | No |
atomic | n / A | Verifique los usos equivocados comunes del paquete sync/atomic | No | No |
empty-lines | n / A | Advierte cuándo hay encabezados o siguiendo nuevas líneas en un bloque | No | No |
line-length-limit | int (predeterminado es a 80) | Especifica el número máximo de caracteres en una línea | No | No |
call-to-gc | n / A | Advierte en una llamada explícita al recolector de basura | No | No |
duplicated-imports | n / A | Busca paquetes que se importen dos o más veces | No | No |
import-shadowing | n / A | Identificadores de manchas que tienen una importación | No | No |
bare-return | n / A | Advierte sobre devoluciones desnudas | No | No |
unused-receiver | n / A | Sugiere cambiar el nombre o eliminar los receptores de métodos no utilizados | No | No |
unhandled-error | []cadena | Advierte sobre los errores no controlados devueltos por las llamadas de funciones | No | Sí |
cognitive-complexity | int (predeterminado es 7) | Establece restricción para la máxima complejidad cognitiva. | No | No |
string-of-int | n / A | Advierte sobre elenco sospechoso de int para cuerda | No | Sí |
string-format | mapa | Advierte sobre literales de cadena específicos que fallan una o más expresiones regulares configuradas por el usuario | No | No |
early-return | []cadena | Manchas declaraciones si el predicado se puede invertir para reducir la anidación | No | No |
unconditional-recursion | n / A | Advierte las llamadas de funciones que conducirán a una recursión infinita (directa) | No | No |
identical-branches | n / A | Mueve declaraciones si las ramas idénticas then y else | No | No |
defer | mapa | Advierte sobre algunos referentes gotchas | No | No |
unexported-naming | n / A | Advierte sobre símbolos no exportados incorrectamente | No | No |
function-length | int, int (predeterminado a 50 declaraciones, 75 líneas) | Advierte sobre funciones que exceden las declaraciones o líneas máximas | No | No |
nested-structs | n / A | Advierte sobre estructuras dentro de las estructuras | No | No |
useless-break | n / A | Advierte sobre declaraciones inútiles break en las cláusulas | No | No |
banned-characters | [] string (predeterminados a [] string {}) | Comprueba personajes prohibidos en identificadores | No | No |
optimize-operands-order | n / A | Verifica expresiones condicionales ineficientes | No | No |
use-any | n / A | Propone reemplazar interface{} con su alias any | No | No |
datarace | n / A | Spots potenciales dataraces | No | No |
comment-spacings | []cadena | Advierte sobre comentarios malformados | No | No |
redundant-import-alias | n / A | Advierte sobre los alias de importación que coinciden con el nombre del paquete importado | No | No |
import-alias-naming | String o map [cadena] cadena (predeterminada para permitir el patrón regex ^[AZ] [A-Z0-9] {0,} $) | Convenciones sobre el nombramiento de alias de importación. | No | No |
enforce-map-style | cadena (predeterminada a "cualquiera") | Aplica un uso consistente de make(map[type]type) o map[type]type{} para la inicialización del mapa. No afecta las construcciones make(map[type]type, size) . | No | No |
enforce-slice-style | cadena (predeterminada a "cualquiera") | Aplica un uso consistente de make([]type, 0) o []type{} para la inicialización de corte. No afecta make(map[type]type, non_zero_len, or_non_zero_cap) . | No | No |
enforce-repeated-arg-type-style | cadena (predeterminada a "cualquiera") | Haga cumplir un estilo consistente para argumentos repetidos y/o tipos de valor de retorno. | No | No |
max-control-nesting | int (predeterminado es a 5) | Establece restricción para el anidado máximo de las estructuras de control. | No | No |
comments-density | int (predeterminado es 0) | Aplica una relación mínima de comentarios / código | No | No |
file-length-limit | Mapa (opcional) | Aplica un número máximo de líneas por archivo | No | No |
filename-format | Expresión regular (opcional) | Aplica el formato de los nombres de archivo | No | No |
redundant-build-tag | n / A | Advierte sobre redundante // +build líneas de comentarios | No | No |
use-errors-new | n / A | Manchas llamadas a fmt.Errorf que pueden ser reemplazadas por errors.New | No | No |
Aquí puede encontrar cómo puede configurar algunas reglas existentes:
var-naming Esta regla acepta dos rebanadas de cadenas, una lista de algodín y una lista de bloques de inicialismos. Por defecto, la regla se comporta exactamente como la alternativa en golint pero opcionalmente, puede relajarla (ver Golint/Lint/Problems/89)
[ rule . var-naming ]
arguments = [[ " ID " ], [ " VM " ]] De esta manera, Revive no advertirá por un identificador llamado customId pero advertirá que customVm debe llamarse customVM .
Esta sección enumera todos los formateros disponibles y proporciona una captura de pantalla para cada una.


El formato predeterminado produce la misma salida que golint .

El formateador simple produce la misma salida que el formateador predeterminado y agrega la URL a la descripción de la regla.

El formateador Unix produce la misma salida que el formato predeterminado pero rodea las reglas en [] .

El formateador json produce salida en formato JSON.
El formateador ndjson produce salida en el formato Newline Delimited JSON .
El formato de checkstyle produce salida en un formato de estilo de checkstyle.
El formateador sarif produce salida en SARIF, para el formato de intercambio de resultados de análisis estáticos , un formato estándar basado en JSON para la salida de herramientas de análisis estático definidos y promovidos por OASIS.
La versión compatible actual del estándar es SARIF-V2.1.0.
La herramienta se puede extender con reglas o formatúas personalizadas. Esta sección contiene información adicional sobre cómo implementar tal.
Para extender el enlace con una regla personalizada, puede llevarlo a este repositorio o usar revive como biblioteca (ver más abajo)
Para agregar un formateador personalizado, tendrá que llevarlo a este repositorio o bifurcarlo. Esto se debe al soporte limitado -buildmode=plugin que funciona solo en Linux (con problemas conocidos).
Cada regla necesita implementar la interfaz lint.Rule :
type Rule interface {
Name () string
Apply ( * File , Arguments ) [] Failure
} El tipo Arguments es un alias de la []interface{} . Los argumentos de la regla se pasan desde el archivo de configuración.
Supongamos que hemos desarrollado una regla llamada BanStructNameRule que nos impide nombrar una estructura con un identificador dado. Podemos establecer el identificador prohibido utilizando el archivo de configuración TomL:
[ rule . ban-struct-name ]
arguments = [ " Foo " ]Con el fragmento arriba nosotros:
ban-struct-name . El método Name() de nuestra regla debe devolver una cadena que coincida con ban-struct-name .Foo . La lista de argumentos se pasará para Apply(*File, Arguments) junto con el archivo de destino que estamos en las líneas actualmente.Se puede encontrar una implementación de reglas de muestra aquí.
revive como una biblioteca Si una regla es específica para su caso de uso (es decir, no es un buen candidato que se agregue al conjunto de reglas de revive ), puede agregarlo a su enlace usando revive como motor de pelusa.
El siguiente código muestra cómo usar revive en su aplicación. En el ejemplo, solo se agrega una regla ( myRule ), por supuesto, puede agregar tantos como sea necesario. Sus reglas se pueden configurar programáticamente o con el archivo de configuración revive estándar. El conjunto completo de reglas de revive también es procesable por su aplicación.
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 { ... } Todavía puede ir más allá y usar revive sin su CLI, como parte de su biblioteca o su 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 { ... }Cada formato necesita implementar la siguiente interfaz:
type Formatter interface {
Format ( <- chan Failure , Config ) ( string , error )
Name () string
} El método Format acepta un canal de instancias Failure y la configuración de las reglas habilitadas. El método Name() debe devolver una cadena diferente de los nombres de las reglas ya existentes. Esta cadena se usa al especificar el formato al invocar la herramienta revive CLI.
Para un formateador de muestra, eche un vistazo a este archivo.
En comparación con golint , revive funciona mejor porque vincula los archivos para cada regla individual en una goroutina separada. Aquí hay un punto de referencia de rendimiento básico en MacBook Pro a principios de 2013 en 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 Tenga en cuenta que si usa reglas que requieren verificación de tipo, el rendimiento puede caer a 2 veces más rápido que golint :
# type checking enabled
time revive kubernetes/... > /dev/null
real 0m26.211s
user 2m6.708s
sys 0m17.192sActualmente, la verificación de tipo está habilitado de forma predeterminada. Si desea ejecutar el enlace sin verificar el tipo, elimine todas las reglas escrita del archivo de configuración.
Por defecto, revive determina si colorear o no su salida en función de si está conectado a un TTY o no. Esto funciona para la mayoría de los casos de uso, pero puede no comportarse como se esperaba si usa revive en una cartera de comandos, donde Stdout se está metiendo en otro comando.
Para forzar la colorización, agregue REVIVE_FORCE_COLOR=1 al entorno en el que está ejecutando. Por ejemplo:
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 | dominiquelefevre | bit-hulk | shmsr | ytnsym |
| Zimmski | MapReal19 | CCE | skaji | ccoveille | tamird |
| markelog | mihaitodor | dvejmz | abeltey | damif94 | Groxx |
| Stephenbuttolph | Stephenbrown2 | LSYTJ0413 | Qascada | ridvansumset | rliebz |
| rdeusser | rmarku | rnikoopour | rafamadriz | pACO0X | PA-M |
| cina | natefinch | nunnatsa | Michalhisim | cero | yagi |
| Techknowlogick | okhowang | guía | me gusta | núcleo | jmckenzieark |
| Haya14busa | fregin | ydah | Willabides | Heyvito | Vincentbaron |
| alcance | vkrol | Kirillsluchaev | Jarema | tarta | tmzane |
| felipedavid | euank | Entrega | Juneezee | ecoix | Exhadales |
| Petethepig | Dirk007 | yangdiangzb | Derekperkins | bboreham | atisco |
| hatamiarash7 | Aragur | amincheloh | kulti | Abrir | abhinav |
| r-rricci | mmcloughlin | Mathieu-Aubin | martinsirbe | avorima | moukoublen |
| muy amado | Johnrichardrinehart | billete | jefersonf | Jamesmaidment | jalaziz |
| granero | atar | cuasilito | davidhsingyuchen | gfariasalves-iones | gburanov |
| ginglis13 | tumbona |
MIT