Linter rápido, configurável, extensível, flexível e bonito para GO. Substituição de Golint. Revive fornece uma estrutura para o desenvolvimento de regras personalizadas e permite definir uma predefinição estrita para aprimorar seus processos de desenvolvimento e revisão de código .
var-namingrevive como uma bibliotecago install github.com/mgechev/revive@latestou obtenha uma página executável liberada na página de lançamentos.
Você pode instalar a filial principal (incluindo a última confirmação) com:
go install github.com/mgechev/revive@master Como o comportamento padrão do revive é compatível com golint , sem fornecer sinalizadores adicionais, a única diferença que você notaria é uma execução mais rápida.
revive suporta um sinalizador -config cujo valor deve corresponder a um arquivo TOML que descreve quais regras usar para o revestimento do revive . Se não for fornecido, revive tentará usar um arquivo de configuração global (assumido para estar localizado em $HOME/revive.toml ). Caso contrário, se nenhum arquivo Toml de configuração for encontrado, revive usará um conjunto interno de regras de linha padrão.
Um volume deve ser montado para compartilhar o repositório atual com o contêiner. Consulte a documentação do Docker de montagem de Bind
docker run -v " $( pwd ) " :/var/ < repository > ghcr.io/mgechev/revive:v1.3.7 -config /var/ < repository > /revive.toml -formatter stylish ./var/kidle/...-v é para o volumeghcr.io/mgechev/revive:v1.3.7 é o nome da imagem e sua versão corresponde ao comando reviveSe você deseja usar o Revive com o Bazel, observe as regras que o Atlassian mantém.
Suporte ao VSCode no VSCode-Go.
Suporte para Goland via Vigilantes de Arquivos.
Suporte ao Atom via Linter-Revive.
Suporte ao VIM via densa-análise/cerveja.
let g: ale_linters = {
' go ' : [ ' revive ' ],
}Suporte ao Neovim via Null-Ls.nvim.
require ( " null-ls " ). setup ({
sources = {
require ( " null-ls " ). builtins . diagnostics . revive
},
})Codeac.io - O serviço de revisão de código automatizado se integra ao GitHub, Bitbucket e Gitlab (mesmo auto -hospedado) e ajuda a combater a dívida técnica. Verifique suas solicitações de tração com o Revive automaticamente. (Grátis para projetos de código aberto)
Para ativar revive no golangci-lint você precisa adicionar revive à lista de linters ativados:
# golangci-lint configuration file
linters :
enable :
- revive Em seguida, revive pode ser configurado adicionando uma entrada à seção linters-settings da configuração, por exemplo:
# 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"] A configuração acima permite três regras de revive : atômico , limite de linha de linha e erro não programado e transmitir alguns argumentos para os dois últimos. A seção de configuração deste documento fornece detalhes sobre como configurar revive . Observe que, embora a configuração revive esteja em Toml, a de golangci-lint está no YAML.
Observe que, se nenhuma configuração específica for fornecida, revive se comportará como go-lint , ou seja, todas as regras go-lint estão ativadas (os detalhes da tabela de regras disponíveis quais são as regras go-lint ). Quando uma configuração é fornecida, apenas as regras na configuração estão ativadas.
revive aceita os seguintes parâmetros da linha de comando:
-config [PATH] - Caminho para o arquivo de configuração no formato TOML, padrão para $HOME/revive.toml se presente.
-exclude [PATTERN] - padrão para arquivos/diretórios/pacotes a serem excluídos para linha. Você pode especificar os arquivos que deseja excluir para linha como nome do pacote (ou seja, github.com/mgechev/revive ), listá -los como arquivos individuais (ou seja, file.go ), diretórios (ou seja ./foo/... ) ou qualquer combinação dos três. Se nenhum padrão de exclusão for especificado, vendor/... será excluído por padrão.
-formatter [NAME] - formatador a ser usado para a saída. Os formatados atualmente disponíveis são:
default - produzirá as falhas da mesma maneira que golint .json - produz as falhas no formato JSON.ndjson - produz as falhas como um fluxo no formato JSON (NDJSON) da Newline Delimited.friendly - produz as falhas quando encontradas. Mostra o resumo de todas as falhas.stylish - formata as falhas em uma tabela. Lembre -se de que ele não transmite a saída para que possa ser percebida como mais lenta em comparação com os outros.checkstyle - produz as falhas no formato XML compatíveis com o do estilo de seleção de Java. -max_open_files - Número máximo de arquivos abertos ao mesmo tempo. Padrões para ilimitar.
-set_exit_status - Defina o status de saída como 1 Se algum problema for encontrado, substitua errorCode e warningCode no Config.
-version - Obtenha a versão de reviver.
revive -config revive.toml -exclude file1.go -exclude file2.go -formatter friendly github.com/mgechev/revive package/...revive.tomlrevive ignorará file1.go e file2.gofriendlygithub.com/mgechev/revive e os arquivos no packageUsando comentários, você pode desativar o linhador para todo o arquivo ou apenas uma variedade de linhas:
//revive:disable
func Public () {}
//revive:enable O trecho acima, desativará revive entre o revive:disable e revive:enable comentários. Se você pular revive:enable , o Linter será desativado para o restante do arquivo.
Com revive:disable-next-line e revive:disable-line você pode desativar revive em uma linha de código específica.
Você pode fazer o mesmo em um nível de regra. Caso você queira desativar apenas uma regra específica, você pode usar:
//revive:disable:unexported-return
func Public () private {
return private
}
//revive:enable:unexported-return Dessa forma, revive não avisa que você está devolvendo um objeto de um tipo não portado, de uma função exportada.
Você pode documentar por que você desative o linhador adicionando um texto à direita na diretiva, por exemplo
//revive:disable Until the code is stable //revive:disable:cyclomatic High complexity score but easy to understand Você também pode configurar revive para aplicar a documentação de diretivas de desativação do Linter, adicionando
[ directive . specify-disable-reason ]na configuração. Você pode definir a gravidade (padrão para aviso ) da violação desta diretiva
[ directive . specify-disable-reason ]
severity = " error " revive pode ser configurado com um arquivo TOML. Aqui está uma configuração de amostra com uma explicação das propriedades individuais:
# 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 " Por padrão, revive permitirá apenas as regras de linha que são nomeadas no arquivo de configuração. Por exemplo, o arquivo de configuração anterior faz revive para ativar apenas as regras ciclomáticas e de revestimento de composições de pacotes .
Para ativar todas as regras disponíveis que você precisa adicionar:
enableAllRules = trueIsso permitirá todas as regras disponíveis, independentemente das regras nomeadas no arquivo de configuração.
Para desativar uma regra, basta marcá -la como desativada na configuração. Por exemplo:
[ rule . line-length-limit ]
Disabled = trueAo ativar todas as regras, você ainda precisa/pode fornecer configurações específicas para regras. O arquivo a seguir é um exemplo de configuração em que todas as regras estão ativadas, exceto para aquelas que são explicitamente desativadas, e algumas regras são configuradas com argumentos específicos:
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 " ] A configuração padrão do revive pode ser encontrada em defaults.toml . Isso permitirá todas as regras disponíveis no golint e usará sua configuração padrão (ou seja, a maneira como elas são codificadas no golint ).
revive -config defaults.toml github.com/mgechev/revive Isso usará o arquivo de configuração defaults.toml , o formatador default e executará o linha sobre o pacote github.com/mgechev/revive .
revive -config config.toml -formatter friendly github.com/mgechev/revive Isso usará config.toml , o formato friendly , e executará o linha sobre o pacote github.com/mgechev/revive .
O snippet a seguir contém a configuração revive recomendada que você pode usar em seu projeto:
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 ]Você também pode configurar exclui o personalizado para cada regra.
É uma alternativa para o 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 " ]Você pode usar os seguintes padrões excluídos
src/pkg/mypkg/some.gosrc/**/*.pb.go~.(pb|auto|generated).go$TEST bem conhecido (o mesmo que **/*_test.go )* e ~ padrões excluem todos os arquivos (o mesmo efeito que desativando a regra) b. "" Padrão (vazio) não exclui nadaNota: Não mexa com
excludeque pode ser usado no nível superior do arquivo Toml, que significa "excluir padrões de pacotes", não "excluir padrões de arquivo"
Lista de todas as regras disponíveis. As regras portadas do golint são deixadas inalteradas e indicadas na coluna golint .
| Nome | Config | Descrição | golint | Digitado |
|---|---|---|---|---|
context-keys-type | n / D | Desaluza o uso de tipos básicos em context.WithValue . | sim | sim |
time-equal | n / D | Sugere usar time.Time.Equal em vez de == e != Para o tempo de verificação da igualdade. | não | sim |
time-naming | n / D | Convenções em torno da nomeação de variáveis de tempo. | sim | sim |
unchecked-type-assertions | n / D | Não permite as afirmações do tipo sem verificar o resultado. | não | sim |
var-declaration | n / D | Reduz redundâncias em torno da declaração variável. | sim | sim |
unexported-return | n / D | Adverte quando um retorno público é do tipo não transportado. | sim | sim |
errorf | n / D | Deve substituir errors.New(fmt.Sprintf()) por fmt.Errorf() | sim | sim |
blank-imports | n / D | Não permite importações em branco | sim | não |
context-as-argument | n / D | context.Context deve ser o primeiro argumento de uma função. | sim | não |
dot-imports | n / D | Proíba . importações. | sim | não |
error-return | n / D | O parâmetro de retorno de erro deve ser o último. | sim | não |
error-strings | []corda | Convenções em torno de seqüências de erros. | sim | não |
error-naming | n / D | Nomeação de variáveis de erro. | sim | não |
exported | []corda | Nomeando e comentando convenções sobre símbolos exportados. | sim | não |
if-return | n / D | Redundante se ao retornar um erro. | não | não |
increment-decrement | n / D | Use i++ e i-- em vez de i += 1 e i -= 1 . | sim | não |
var-naming | Lista de permissões e lista de bloqueios de inicialismos | Regras de nomeação. | sim | não |
package-comments | n / D | Convenções de comentários do pacote. | sim | não |
range | n / D | Impede variáveis redundantes ao iterar sobre uma coleção. | sim | não |
receiver-naming | mapa (opcional) | Convenções em torno da nomeação de receptores. | sim | não |
indent-error-flow | []corda | Impede declarações redundantes. | sim | não |
argument-limit | int (padrão para 8) | Especifica o número máximo de argumentos que uma função pode receber | não | não |
cyclomatic | int (padrão para 10) | Define restrições para a complexidade ciclomática máxima. | não | não |
max-public-structs | int (padrão para 5) | O número máximo de estruturas públicas em um arquivo. | não | não |
file-header | String (padrão para nenhum) | Cabeçalho que cada arquivo deve ter. | não | não |
empty-block | n / D | Alerta em blocos de código vazios | não | sim |
superfluous-else | []corda | Impede declarações redundantes de eliminação (estende indent-error-flow ) | não | não |
confusing-naming | n / D | Alerta sobre métodos com nomes que diferem apenas por capitalização | não | não |
get-return | n / D | Alerta em getters que não produzem nenhum resultado | não | não |
modifies-parameter | n / D | Alerta sobre as atribuições para os parâmetros de função | não | não |
confusing-results | n / D | Sugere para nomear resultados potencialmente confusos da função | não | não |
deep-exit | n / D | Procura saídas de programa em funcs que não sejam main() ou init() | não | não |
unused-parameter | n / D | Sugere renomear ou remover parâmetros de função não utilizados | não | não |
unreachable-code | n / D | Alerta sobre código inacessível | não | não |
add-constant | mapa | Sugere usar constantes para números mágicos e literais de cordas | não | não |
flag-parameter | n / D | Avisa sobre parâmetros booleanos que criam um acoplamento de controle | não | não |
unnecessary-stmt | n / D | Sugere remover ou simplificar declarações desnecessárias | não | não |
struct-tag | []corda | Verifica tags de estrutura comuns como json , xml , yaml | não | não |
modifies-value-receiver | n / D | Alerta sobre as atribuições para os receptores de métodos passados por valor | não | sim |
constant-logical-expr | n / D | Adverte sobre expressões lógicas constantes | não | não |
bool-literal-in-expr | n / D | Sugere remover literais booleanos de expressões lógicas | não | não |
redefines-builtin-id | n / D | Alerta sobre redefinições de identificadores de construção | não | não |
function-result-limit | int (padrão para 3) | Especifica o número máximo de resultados que uma função pode retornar | não | não |
imports-blocklist | []corda | Não conquistar a importação dos pacotes especificados | não | não |
range-val-in-closure | n / D | Adverte se o valor do alcance for usado em um fechamento despachado como goroutine | não | não |
range-val-address | n / D | Adverte se o endereço do valor do alcance for usado perigosamente | não | sim |
waitgroup-by-value | n / D | Avisa sobre funções que tomam sync.waitgroup como um parâmetro de valor | não | não |
atomic | n / D | Verifique se há usos equivocados comuns do pacote de sync/atomic | não | não |
empty-lines | n / D | Avisa quando há linhas de novo ou atrás em um bloco | não | não |
line-length-limit | int (padrão para 80) | Especifica o número máximo de caracteres em uma linha | não | não |
call-to-gc | n / D | Alerta em chamadas explícitas para o coletor de lixo | não | não |
duplicated-imports | n / D | Procura pacotes que são importados duas ou mais vezes | não | não |
import-shadowing | n / D | Pontos identificadores que sombream uma importação | não | não |
bare-return | n / D | Alerta sobre retornos nus | não | não |
unused-receiver | n / D | Sugere renomear ou remover receptores de método não utilizados | não | não |
unhandled-error | []corda | Alerta sobre erros não tratados devolvidos por chamadas de função | não | sim |
cognitive-complexity | int (padrão para 7) | Define restrições para a máxima complexidade cognitiva. | não | não |
string-of-int | n / D | Alerta em elencos suspeitos de int a string | não | sim |
string-format | mapa | Avisa em literais específicos que falham em uma ou mais expressões regulares configuradas pelo usuário | não | não |
early-return | []corda | Pontos de pontos se-then-else declarações onde o predicado pode ser invertido para reduzir o ninho | não | não |
unconditional-recursion | n / D | Alerta em chamadas de função que levarão a recursão infinita (direta) | não | não |
identical-branches | n / D | Placões de spots if-then-else com idênticas then e else ramificações | não | não |
defer | mapa | Avisa em alguns adiosos | não | não |
unexported-naming | n / D | Adverte em símbolos não exportados denominados | não | não |
function-length | int, int (padrão para 50 declarações, 75 linhas) | Avisa sobre funções que excedem as declarações ou linhas máximas | não | não |
nested-structs | n / D | Alerta em estruturas dentro de estruturas | não | não |
useless-break | n / D | Adverte sobre declarações inúteis break nas cláusulas | não | não |
banned-characters | [] String (padrão para [] string {}) | Cheques caracteres proibidos em identificadores | não | não |
optimize-operands-order | n / D | Verifica expressões condicionais ineficientes | não | não |
use-any | n / D | Propõe substituir interface{} por seu any | não | não |
datarace | n / D | Pontos PODENTES DATARACES PODENTES | não | não |
comment-spacings | []corda | Alerta sobre comentários malformados | não | não |
redundant-import-alias | n / D | Alerta sobre aliases de importação que correspondam ao nome do pacote importado | não | não |
import-alias-naming | string ou map [string] string (padrões para permitir o padrão regex ^[az] [a-z0-9] {0,} $) | Convenções em torno da nomeação de aliases de importação. | não | não |
enforce-map-style | String (padrão para "qualquer" | Aplica o uso consistente de make(map[type]type) ou map[type]type{} para inicialização do mapa. Não afeta as construções make(map[type]type, size) . | não | não |
enforce-slice-style | String (padrão para "qualquer" | Aplica o uso consistente do make([]type, 0) ou []type{} para inicialização da fatia. Não afeta as construções make(map[type]type, non_zero_len, or_non_zero_cap) . | não | não |
enforce-repeated-arg-type-style | String (padrão para "qualquer" | Aplica o estilo consistente para argumentos repetidos e/ou tipos de valor de retorno. | não | não |
max-control-nesting | int (padrão para 5) | Define restrições para o ninho máximo das estruturas de controle. | não | não |
comments-density | int (padrão para 0) | Aplica uma relação de comentário / código mínimo | não | não |
file-length-limit | mapa (opcional) | Aplica um número máximo de linhas por arquivo | não | não |
filename-format | Expressão regular (opcional) | Aplica a formatação de nomes de arquivos | não | não |
redundant-build-tag | n / D | Avisa sobre redundantes // +build linhas de comentários | não | não |
use-errors-new | n / D | Spots chamadas para fmt.Errorf que podem ser substituídas por errors.New | não | não |
Aqui você pode descobrir como você pode configurar algumas regras existentes:
var-naming Esta regra aceita duas fatias de cordas, uma lista de permissões e uma lista de bloqueios de inicialismos. Por padrão, a regra se comporta exatamente como a alternativa no golint , mas opcionalmente, você pode relaxá -la (consulte Golint/fiapos/problemas/89)
[ rule . var-naming ]
arguments = [[ " ID " ], [ " VM " ]] Dessa forma, o Revive não avisa para um identificador chamado customId , mas alertará que customVm deve ser chamado de customVM .
Esta seção lista todos os formatados disponíveis e fornece uma captura de tela para cada uma.


O formatador padrão produz a mesma saída que golint .

O formatador simples produz a mesma saída que o formatador padrão e anexa o URL à descrição da regra.

O Formatter Unix produz a mesma saída que o formatador padrão, mas envolve as regras em [] .

O formatador json produz saída no formato JSON.
O ndjson Formatter produz saída no formato Newline Delimited JSON .
O formatador de checkstyle produz saída em um formato semelhante a um estilo de seleção.
O formatador sarif produz saída no SARIF, para resultados de análise estática Formato de intercâmbio , um formato baseado em JSON padrão para a saída de ferramentas de análise estática definidas e promovidas pelo Oasis.
A versão suportada atual do padrão é SARIF-V2.1.0.
A ferramenta pode ser estendida com regras ou formatados personalizados. Esta seção contém informações adicionais sobre como implementar isso.
Para estender o linhador com uma regra personalizada, você pode empurrá -lo para este repositório ou usar revive como uma biblioteca (veja abaixo)
Para adicionar um formatador personalizado, você terá que empurrá -lo a este repositório ou forçar. Isso se deve ao suporte limitado -buildmode=plugin , que funciona apenas no Linux (com problemas conhecidos).
Cada regra precisa implementar a interface lint.Rule :
type Rule interface {
Name () string
Apply ( * File , Arguments ) [] Failure
} O tipo Arguments é um alias da []interface{} . Os argumentos da regra são passados do arquivo de configuração.
Suponhamos que desenvolvemos uma regra chamada BanStructNameRule , que nos prevê nomear uma estrutura com um determinado identificador. Podemos definir o identificador proibido usando o arquivo de configuração do TOML:
[ rule . ban-struct-name ]
arguments = [ " Foo " ]Com o trecho acima de nós:
ban-struct-name . O método Name() de nossa regra deve retornar uma string que corresponda ban-struct-name .Foo . A lista de argumentos será passada para Apply(*File, Arguments) juntamente com o arquivo de destino que estamos lineando atualmente.Uma amostra de implementação de regra pode ser encontrada aqui.
revive como uma biblioteca Se uma regra for específica para o seu caso de uso (ou seja, não é um bom candidato a ser adicionado para revive o conjunto de regras), você pode adicioná -lo ao seu linhador usando revive como um mecanismo de linha.
O código a seguir mostra como usar revive em seu aplicativo. No exemplo, apenas uma regra é adicionada ( myRule ), é claro, você pode adicionar o máximo necessário. Suas regras podem ser configuradas programaticamente ou com o arquivo de configuração revive padrão. O conjunto completo de regra de revive também é acionável pelo seu aplicativo.
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 { ... } Você ainda pode ir além e usar revive sem a CLI, como parte da sua biblioteca ou da sua 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 formatador precisa implementar a seguinte interface:
type Formatter interface {
Format ( <- chan Failure , Config ) ( string , error )
Name () string
} O método Format aceita um canal de instâncias Failure e a configuração das regras ativadas. O método Name() deve retornar uma string diferente dos nomes das regras já existentes. Essa string é usada ao especificar o formatador ao invocar a ferramenta revive CLI.
Para um formatador de amostra, dê uma olhada nesse arquivo.
Comparado ao golint , revive tem um desempenho melhor porque fia os arquivos para cada regra individual em uma goroutina separada. Aqui está um benchmark de desempenho básico no MacBook Pro no início de 2013 Run on 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 Lembre -se de que, se você usar regras que exigirem verificação do tipo, o desempenho poderá cair para 2x mais rápido que golint :
# type checking enabled
time revive kubernetes/... > /dev/null
real 0m26.211s
user 2m6.708s
sys 0m17.192sAtualmente, a verificação do tipo é ativada por padrão. Se você deseja executar o linhador sem verificação do tipo, remova todas as regras digitadas do arquivo de configuração.
Por padrão, revive determina se deve ou não colorizar sua saída com base se está conectado a um TTY ou não. Isso funciona para a maioria dos casos de uso, mas pode não se comportar conforme o esperado se você usar revive em um pipeline de comandos, onde o stdout está sendo canalizado para outro comando.
Para forçar a coloração, adicione REVIVE_FORCE_COLOR=1 ao ambiente em que você está executando. Por exemplo:
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 | 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 | como | KernelTravel | JMckenzieark |
| haya14busa | Fregin | ydah | Willabides | heyvito | Vincentbaron |
| Scop | vkrol | Kirillsluchaev | Jarema | Tartale | tmzane |
| Felipedavid | euank | Entuazismo | Juneezee | Echoix | Existe |
| petethepig | Dirk007 | Yangdiangzb | Derekperkins | BBOREHAM | ATN |
| hatamiarash7 | Aragur | Amincheloh | Kulti | ABIRDCFLY | Abhinav |
| R-ICRCI | Mmcloughlin | Mathieu-Aubin | Martinsirbe | AVORIMA | Moukoublen |
| muito amado | Johnrichardrinehart | paredes | Jefesonf | Jamesmaidment | Jalaziz |
| Grongor | gravata | Quasilyte | Davidhsingyuchen | gfariasalves-ionos | Gburanov |
| Ginglis13 | Fless |
Mit