
Un analyseur statique et un linter pour le code de Clojure qui déclenche la joie.

Merci beaucoup pour Clj-Kondo. C'est comme un compagnon pour moi. Il a à nouveau rendu Clojure.
- @Geraldodev sur les Clojuans Slack
CLJ-Kondo effectue une analyse statique sur Clojure, Clojurescript et Edn. Il vous informe des erreurs potentielles pendant que vous tapez (sans exécuter votre programme).
CLJ-Kondo détecte:
defdo et let les emballageslet et letfnrecur )clojure.test/deftestAvant que votre formulaire ne frappe le REP.
Il suggère plusieurs recommandations de guide de style, telles que:
:else comme expression de test fourre-tout dans cond (voir Guide de style Clojure)seq au lieu de (not (empty? ,,,)) (voir Guide de style Clojure)
Il prend en charge la syntaxe de macros couramment utilisés comme clojure.core.async/alt!! , schema.core/defn et potemkin/import-vars .
Il détecte les erreurs courantes dans deps.edn et bb.edn
Il fournit des données d'analyse afin que vous créez vos propres liners personnalisés.
Voir tous les liners disponibles ici.
Ce linter est:
.clj , .cljs , .cljc et .edn fichiersEssayez Clj-Kondo sur le terrain de jeu interactif.
Regardez le discours:
Vous pouvez soutenir ce projet via des sponsors GitHub, OpenCollective, Ko-Fi ou indirectement via des cloruristes ensemble.
Peluche de stdin:
$ echo ' (def x (def x 1)) ' | clj-kondo --lint -
<stdin>:1:8: warning: inline defLint un fichier:
$ echo ' (def x (def x 1)) ' > /tmp/foo.clj
$ clj-kondo --lint /tmp/foo.clj
/tmp/foo.clj:1:8: warning: inline defLint un répertoire:
$ 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 un projet de classe de projet:
$ clj-kondo --lint " $( lein classpath ) "Aide:
$ 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. Pour détecter les erreurs de charpie sur les espaces de noms de votre projet, un cache est nécessaire. Pour faire savoir à Clj-Kondo où en créer un, faites un répertoire .clj-kondo à la racine de votre projet, ce qui signifie au même niveau que votre project.clj , deps.edn ou build.boot :
$ mkdir -p .clj-kondo Un cache sera créé à l'intérieur lorsque vous exécutez clj-kondo . Avant de se lier à l'intérieur de votre éditeur, il est recommandé de pelucher l'ensemble du chemin de classe pour enseigner clj-kondo toutes les bibliothèques que vous utilisez, y compris Clojure et / ou Clojurescript lui-même. Certaines bibliothèques sont livrées avec des configurations. Pour les importer, comprenez d'abord:
$ clj-kondo --lint " <classpath> " --dependencies --copy-configs --skip-lint L'indicateur --copy-configs recherche et copiera les configurations à partir des dépendances dans le répertoire .clj-kondo , tout en libant (voir config.md).
Avec les configurations en place, nous pouvons désormais analyser correctement les dépendances:
$ clj-kondo --lint " <classpath> " --dependencies --parallel Le FLAGE --dependencies indique que CLJ-Kondo est utilisé pour analyser des sources pour remplir le cache. Lorsqu'il est activé, CLJ-Kondo supprimera les avertissements et sautera des fichiers .jar déjà lisés pour les performances.
L'option --parallel utilisera plusieurs threads pour peindre vos sources, les passant plus rapidement.
Remarque: Dans la version après 2024.05.24 , la copie des configurations et des dépendances de liaison peuvent être effectuées en une seule fois en utilisant:
$ clj-kondo --lint " <classpath> " --dependencies --parallel --copy-configsCréer des moyens spécifiques de l'outil pour obtenir un chemin de classe:
lein classpathboot with-cp -w -f -clojure -Spathnpx shadow-cljs classpath Donc, pour lein toute la commande serait:
$ clj-kondo --lint "$(lein classpath)" --dependencies --parallel --copy-configs
Vous êtes maintenant prêt à peluchez des fichiers uniques à l'aide de l'intégration de l'éditeur. Une simulation de ce qui se passe lorsque vous modifiez un fichier dans votre éditeur:
$ echo ' (select-keys) ' | clj-kondo --lang cljs --lint -
<stdin>:1:1: error: Wrong number of args (0) passed to cljs.core/select-keys Étant donné que CLJ-Kondo connaît maintenant votre version de Clojurescript via le cache, il détecte que le nombre d'arguments que vous avez transmis à select-keys est invalide. Chaque fois que vous modifiez un fichier, le cache est mis à jour progressivement, donc Clj-Kondo est informé des nouvelles fonctions que vous venez d'écrire.
Si vous souhaitez utiliser un autre répertoire pour lire et écrire le cache, utilisez l'option --cache-dir . Pour désactiver le cache même si vous avez un répertoire .clj-kondo , utilisez --cache false .
Les codes de sortie peuvent être contrôlés par l'option --fail-level <level> . Le niveau d'échec par défaut est warning qui renvoie les codes de sortie comme suit:
0 : Aucune erreur ou avertissement n'a été trouvé2 : Un ou plusieurs avertissements ont été trouvés3 : une ou plusieurs erreurs ont été trouvées Si --fail-level error est fournie, les avertissements ne conduisent pas à un code de sortie non nul:
0 : Aucune erreur n'a été trouvée0 : un ou plusieurs avertissements ont été trouvés3 : une ou plusieurs erreurs ont été trouvées Tous les codes de sortie autres que 0 , 2 et 3 indiquent une erreur en raison d'un bug dans CLJ-Kondo ou d'une autre erreur inattendue au-delà du contrôle de CLJ-Kondo.
Comme CLJ-Kondo est un analyseur statique n'a pas besoin d'un runtime (JVM, navigateur, node.js, etc.). Il n'exécute pas votre code. En tant que tel, cela peut être une alternative plus rapide aux liners qui utilisent un temps d'exécution, comme Eastwood. Cette approche est livrée avec la limitation que CLJ-Kondo ne peut pas exécuter vos macros car les macros peuvent utiliser des fonctionnalités arbitraires à partir d'un temps d'exécution. CLJ-Kondo soutient les macros de base de Clojure et certaines bibliothèques populaires de la communauté. Les macros qui ne sont pas prises en charge hors de la boîte peuvent être prises en charge à l'aide de la configuration. L'une des façons de configurer les macros est d'écrire des crochets pour eux (voir également ce blog). Pour de nombreuses bibliothèques, il existe déjà une configuration disponible que vous pouvez importer. Consultez également les configurations CLJ-Kondo qui contient des configurations pour les bibliothèques tierces.
CLJ-Kondo peut être invoqué comme un pod 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 et inspirationCopyright © 2019 - 2023 Michiel Borkent
Distribué sous la licence EPL, comme Clojure. Voir la licence.
Le répertoire inlined contient la source de tools.reader qui est sous licence EPL.
L' parser annuaire contient une source modifiée de rewrite-clj qui est sous licence MIT.