
Um analisador e linhador estático para o código de clojure que desperta alegria.

Muito obrigado por Clj-Kondo. É como um companheiro para mim. Isso tornou o Clojure divertido novamente.
- @GeralDODODODEN ON CLOJURIANS SLACK
O CLJ-Kondo realiza análise estática em Clojure, Clojurescript e Edn. Ele informa sobre possíveis erros enquanto você digita (sem executar seu programa).
Clj-Kondo detecta:
def em linhado e let embrulharlet e letfn locaisrecur )clojure.test/deftestAntes que seu formulário atinja o REPL.
Ele sugere várias recomendações de guia de estilo, como:
:else como a expressão de teste de Catch-All em cond (consulte o Guia do Estilo Clojure)seq em vez de (not (empty? ,,,)) (consulte o Guia do estilo Clojure)
Possui suporte para sintaxe de macros comumente usadas como clojure.core.async/alt!! , schema.core/defn e potemkin/import-vars .
Ele detecta erros comuns em deps.edn e bb.edn
Ele fornece dados de análise para que você crie seus próprios linhentes personalizados.
Veja todos os linters disponíveis aqui.
Este linter é:
.clj , .cljs , .cljc e .ednExperimente Clj-Kondo no playground interativo.
Assista à conversa:
Você pode apoiar este projeto por meio de patrocinadores do Github, OpenCollective, Ko-Fi ou indiretamente através de clojuristas juntos.
Fiapos de stdin:
$ echo ' (def x (def x 1)) ' | clj-kondo --lint -
<stdin>:1:8: warning: inline defFia um arquivo:
$ echo ' (def x (def x 1)) ' > /tmp/foo.clj
$ clj-kondo --lint /tmp/foo.clj
/tmp/foo.clj:1:8: warning: inline defFia um diretório:
$ clj-kondo --lint src
src/clj_kondo/test.cljs:7:1: warning: redundant do
src/clj_kondo/calls.clj:291:3: error: Wrong number of args (1) passed to clj-kondo.calls/analyze-callsFia um projeto de classe:
$ clj-kondo --lint " $( lein classpath ) "Ajuda:
$ clj-kondo --help
clj-kondo v2024.11.14
Options:
--lint <file>: a file can either be a normal file, directory or classpath. In the
case of a directory or classpath, only .clj, .cljs and .cljc will be
processed. Use - as filename for reading from stdin.
--lang <lang>: if lang cannot be derived from the file extension this option will be
used. Supported values: clj, cljs, cljc.
--filename <file>: in case stdin is used for linting, use this to set the
reported filename.
--cache-dir: when this option is provided, the cache will be resolved to this
directory. If --cache is false, this option will be ignored.
--cache: if false, won't use cache. Otherwise, will try to resolve cache
using `--cache-dir`. If `--cache-dir` is not set, cache is resolved using the
nearest `.clj-kondo` directory in the current and parent directories.
--config <config>: extra config that is merged. May be a file or an EDN expression. See https://github.com/clj-kondo/clj-kondo/blob/master/doc/config.md.
--config-dir <config-dir>: use this config directory instead of auto-detected
.clj-kondo dir.
--parallel: lint sources in parallel.
--dependencies: don't report any findings. Useful for populating cache while linting dependencies.
--copy-configs: copy configs from dependencies while linting.
--skip-lint: skip lint/analysis, still check for other tasks like copy-configs.
--fail-level <level>: minimum severity for exit with error code. Supported values:
warning, error. The default level if unspecified is warning.
--report-level <level>: minimum severity for which to report. Supported values:
info, warning, error. The default level if unspecified is info.
--debug: print debug information. Para detectar erros de LINT nos namespaces em seu projeto, é necessário um cache. Para informar o Clj-Kondo onde criar um, faça um diretório .clj-kondo na raiz do seu projeto, o que significa no mesmo nível que o seu project.clj , deps.edn ou build.boot :
$ mkdir -p .clj-kondo Um cache será criado dentro dele quando você executar clj-kondo . Antes de fazer linhas dentro do seu editor, é recomendável fingir todo o caminho de classe para ensinar clj-kondo sobre todas as bibliotecas que você está usando, incluindo clojure e/ou clojurescript. Algumas bibliotecas vêm com configurações. Para importá -los, primeiro execute:
$ clj-kondo --lint " <classpath> " --dependencies --copy-configs --skip-lint O sinalizador --copy-configs pesquisará e copiará configurações de dependências para o diretório .clj-kondo , durante o linhagem (consulte Config.md).
Com as configurações em vigor, agora podemos analisar as dependências corretamente:
$ clj-kondo --lint " <classpath> " --dependencies --parallel O sinalizador --dependencies indica que o CLJ-kondo é usado para analisar fontes para preencher o cache. Quando ativado, o CLJ-Kondo suprimirá avisos e pulará os arquivos .jar já fiados para desempenho.
A opção --parallel usará vários threads para fingir suas fontes, passando por eles mais rapidamente.
Nota: Na versão após 2024.05.24 , copiar configurações e dependências de linha podem ser feitas de uma só vez usando:
$ clj-kondo --lint " <classpath> " --dependencies --parallel --copy-configsCrie maneiras específicas da ferramenta de obter um caminho de classe:
lein classpathboot with-cp -w -f -clojure -Spathnpx shadow-cljs classpath Então, para lein todo o comando seria:
$ clj-kondo --lint "$(lein classpath)" --dependencies --parallel --copy-configs
Agora você está pronto para lint arquivos únicos usando a integração do editor. Uma simulação do que acontece quando você edita um arquivo em seu editor:
$ echo ' (select-keys) ' | clj-kondo --lang cljs --lint -
<stdin>:1:1: error: Wrong number of args (0) passed to cljs.core/select-keys Como o CLJ-KONDO agora conhece sua versão do CloJurescript através do cache, ele detecta que o número de argumentos que você passou para select-keys é inválido. Cada vez que você edita um arquivo, o cache é atualizado de forma incremental, para que o CLJ-KONDO seja informado sobre as novas funções que você acabou de escrever.
Se você deseja usar um diretório diferente para ler e escrever o cache, use a opção --cache-dir . Para desativar o cache, mesmo se você tiver um diretório .clj-kondo , use --cache false .
Os códigos de saída podem ser controlados pela opção --fail-level <level> . O nível de falha padrão está warning que retorna códigos de saída da seguinte forma:
0 : Nenhum erro ou aviso foi encontrado2 : Um ou mais avisos foram encontrados3 : Um ou mais erros foram encontrados Se --fail-level error for fornecido, os avisos não levam a um código de saída diferente de zero:
0 : Nenhum erro foi encontrado0 : Um ou mais avisos foram encontrados3 : Um ou mais erros foram encontrados Todos os códigos de saída diferentes de 0 , 2 e 3 indicam um erro devido a um bug no CLJ-kondo ou algum outro erro inesperado além do controle do CLJ-Kondo.
Como o clj-kondo é um analisador estático é não precisa de um tempo de execução (JVM, navegador, node.js, etc.). Não executa seu código. Como tal, pode ser uma alternativa mais rápida para os liners que usam um tempo de execução, como Eastwood. Essa abordagem vem com a limitação de que o CLJ-Kondo não pode executar suas macros, pois as macros podem usar recursos arbitrários de um tempo de execução. O CLJ-KONDO tem suporte para macros do Clojure Core e algumas bibliotecas populares da comunidade. As macros que não são suportadas prontas para uso podem ser suportadas usando a configuração. Uma das maneiras de configurar macros é escrever ganchos para eles (consulte também este post do blog). Para muitas bibliotecas, já existe uma configuração disponível que você pode importar. Confira também as configurações CLJ-Kondo, que contém configurações para bibliotecas de terceiros.
Clj-Kondo pode ser invocado como uma vagem de Babashka.
#! /usr/bin/env bb
( ns script
( :require [babashka.pods :as pods]))
( pods/load-pod " clj-kondo " )
( require '[pod.borkdude.clj-kondo :as clj-kondo])
( clj-kondo/merge-configs
'{ :linters { :unresolved-symbol { :exclude [( foo1.bar )]}}}
'{ :linters { :unresolved-symbol { :exclude [( foo2.bar )]}}})
; ;=> {:linters {:unresolved-symbol {:exclude [(foo1.bar) (foo2.bar)]}}}
( -> ( clj-kondo/run! { :lint [ " src " ]})
:summary )
; ;=> {:error 0, :warning 0, :info 0, :type :summary, :duration 779} var-info.edn e inspiraçãoCopyright © 2019 - 2023 Michiel Borkent
Distribuído sob a licença EPL, o mesmo que o Clojure. Consulte a licença.
O diretório inlined contém a fonte do tools.reader , que é licenciado sob a licença EPL.
O parser de diretório contém fonte modificada do rewrite-clj , licenciado sob a licença do MIT.