
Un analizador estático y un enlace para el código Clojure que provoca alegría.

Muchas gracias por Clj-Kondo. Es como un compañero para mí. Ha hecho que Clojure sea divertido de nuevo.
- @Gerdodev en Clojurians Slack
CLJ-Kondo realiza un análisis estático sobre Clojure, Clojurescript y Edn. Le informa sobre posibles errores mientras está escribiendo (sin ejecutar su programa).
CLJ-Kondo detecta:
defdo y let Wrappingslet y letfn Binding llamadas vinculantesrecur )clojure.test/deftestantes de que su formulario presente el repl.
Sugiere varias recomendaciones de guía de estilo, como:
:else , como la expresión de prueba de Catch-All en cond (ver guía de estilo Clojure)seq en lugar de (not (empty? ,,,)) (ver Clojure Style Guide)
Tiene soporte para la sintaxis de macros de uso común como clojure.core.async/alt!! , schema.core/defn y potemkin/import-vars .
Detecta errores comunes en deps.edn y bb.edn
Proporciona datos de análisis para que cree sus propias revestimientos personalizados.
Vea todas las líneas disponibles aquí.
Este linter es:
.clj , .cljs , .cljc y .edn archivosPrueba CLJ-Kondo en el patio interactivo.
Mira la charla:
Puede apoyar este proyecto a través de patrocinadores de GitHub, OpenColective, Ko-Fi o indirectamente a través de Clojurists juntos.
Lenta de Stdin:
$ echo ' (def x (def x 1)) ' | clj-kondo --lint -
<stdin>:1:8: warning: inline defDirección de un archivo:
$ echo ' (def x (def x 1)) ' > /tmp/foo.clj
$ clj-kondo --lint /tmp/foo.clj
/tmp/foo.clj:1:8: warning: inline defPelusa un directorio:
$ 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-callsLint a un proyecto classpath:
$ clj-kondo --lint " $( lein classpath ) "Ayuda:
$ 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 errores de pelusa en los espacios de nombres de su proyecto, se necesita un caché. Para que CLJ-Kondo sepa dónde crear uno, haga un directorio .clj-kondo en la raíz de su proyecto, lo que significa en el mismo nivel que su project.clj , deps.edn o build.boot :
$ mkdir -p .clj-kondo Se creará un caché dentro de él cuando ejecute clj-kondo . Antes de pelear dentro de su editor, se recomienda pellizar todo el ClassPath para enseñar clj-kondo sobre todas las bibliotecas que está utilizando, incluidos Clojure y/o ClojureScript. Algunas bibliotecas vienen con configuraciones. Para importarlos, primero en ejecución:
$ clj-kondo --lint " <classpath> " --dependencies --copy-configs --skip-lint El indicador --copy-configs buscará y copiará configuraciones de las dependencias en el directorio .clj-kondo , mientras se pelea (ver config.md).
Con las configuraciones en su lugar, ahora podemos analizar las dependencias correctamente:
$ clj-kondo --lint " <classpath> " --dependencies --parallel El indicador --dependencies indica que CLJ-Kondo se usa para analizar las fuentes para completar el caché. Cuando está habilitado, CLJ-Kondo suprimirá las advertencias y se saltará sobre archivos .jar ya pelados para su rendimiento.
La opción --parallel usará múltiples hilos para vincular sus fuentes, revisándolas más rápido.
Nota: En la versión después de 2024.05.24 , las configuraciones de copia y las dependencias de pelusa se pueden hacer de una vez utilizando:
$ clj-kondo --lint " <classpath> " --dependencies --parallel --copy-configsCree formas específicas de herramientas para obtener un classpath:
lein classpathboot with-cp -w -f -clojure -Spathnpx shadow-cljs classpath Entonces, para lein todo el comando sería:
$ clj-kondo --lint "$(lein classpath)" --dependencies --parallel --copy-configs
Ahora está listo para pelear archivos únicos utilizando la integración del editor. Una simulación de lo que sucede cuando edita un archivo en su editor:
$ echo ' (select-keys) ' | clj-kondo --lang cljs --lint -
<stdin>:1:1: error: Wrong number of args (0) passed to cljs.core/select-keys Dado que CLJ-Kondo ahora conoce su versión de ClojureScript a través del caché, detecta que la cantidad de argumentos que pasó a select-keys no es válido. Cada vez que edita un archivo, el caché se actualiza incrementalmente, por lo que CLJ-Kondo está informado sobre las nuevas funciones que acaba de escribir.
Si desea usar un directorio diferente para leer y escribir el caché, use la opción --cache-dir . Para deshabilitar el caché incluso si tiene un directorio .clj-kondo , use --cache false .
Los códigos de salida se pueden controlar mediante la opción --fail-level <level> . El nivel de falla predeterminado es warning que devuelve los códigos de salida de la siguiente manera:
0 : No se encontraron errores ni advertencias2 : se encontraron una o más advertencias3 : se encontraron uno o más errores Si se suministra --fail-level error , las advertencias no conducen a un código de salida no cero:
0 : No se encontraron errores0 : se encontraron una o más advertencias3 : se encontraron uno o más errores Todos los códigos de salida que no sean 0 , 2 y 3 indican un error debido a un error en CLJ-Kondo o algún otro error inesperado más allá del control de CLJ-Kondo.
Como Clj-Kondo es un analizador estático, no necesita un tiempo de ejecución (JVM, navegador, node.js, etc.). No ejecuta su código. Como tal, puede ser una alternativa más rápida a las líneas que usan un tiempo de ejecución, como Eastwood. Este enfoque viene con la limitación de que Clj-Kondo no puede ejecutar sus macros, ya que las macros pueden usar funciones arbitrarias desde un tiempo de ejecución. CLJ-Kondo cuenta con el apoyo a Clojure Core Macros y algunas bibliotecas populares de la comunidad. Las macros que no son compatibles con la caja pueden ser compatibles con la configuración. Una de las formas de configurar macros es escribir ganchos para ellos (también vea este blog). Para muchas bibliotecas ya hay una configuración disponible que puede importar. También consulte las configuraciones CLJ-Kondo que contiene configuraciones para bibliotecas de terceros.
Clj-Kondo se puede invocar como una vaina 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 inspiraciónCopyright © 2019 - 2023 Michiel Borkent
Distribuido bajo la licencia EPL, igual que Clojure. Ver licencia.
El directorio inlined contiene fuente de tools.reader , que tiene licencia bajo la licencia EPL.
El parser de directorio contiene una fuente modificada de rewrite-clj que tiene licencia bajo la licencia MIT.