
Ein statischer Analysator und ein Abteller für Clojure -Code, der Freude auslöst.

Vielen Dank für Clj-Kondo. Es ist wie ein Begleiter für mich. Es hat Clojure wieder Spaß gemacht.
- @geraldodev über die clojurianer locker
CLJ-Kondo führt eine statische Analyse zu Clojure, ClojureScript und Edn durch. Es informiert Sie über mögliche Fehler beim Eingeben (ohne Ihr Programm auszuführen).
CLJ-Kondo erkennt:
def -Ausdrückelet dolet und letfn -Bindungsaufrufenrecur )clojure.test/deftestBevor Ihr Formular die Wiederholung trifft.
Es schlägt mehrere Empfehlungen für Style Guide vor, z. B.:
:else der Cat-All-Test-Ausdruck in cond (siehe Clojure-Style-Handbuch)seq anstelle von (not (empty? ,,,)) (siehe Clojure -Style -Handbuch)
Es unterstützt die Syntax von häufig verwendeten Makros wie clojure.core.async/alt!! , schema.core/defn und potemkin/import-vars .
Es erkennt häufige Fehler in deps.edn und bb.edn
Es enthält Analysedaten, damit Sie Ihre eigenen benutzerdefinierten Linter erstellen.
Sehen Sie sich hier alle verfügbaren Linter an.
Dieser Linter ist:
.clj , .cljs , .cljc und .edn -DateienProbieren Sie Clj-Kondo auf dem interaktiven Spielplatz.
Sehen Sie sich das Gespräch an:
Sie können dieses Projekt über Github-Sponsoren, OpenCollective, Ko-Fi oder indirekt zusammen über Clojuristen unterstützen.
Lint aus Stdin:
$ echo ' (def x (def x 1)) ' | clj-kondo --lint -
<stdin>:1:8: warning: inline defFININT Eine Datei:
$ echo ' (def x (def x 1)) ' > /tmp/foo.clj
$ clj-kondo --lint /tmp/foo.clj
/tmp/foo.clj:1:8: warning: inline defFININT Ein Verzeichnis:
$ 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-callsFININT A PROJECT CLASSPATH:
$ clj-kondo --lint " $( lein classpath ) "Helfen:
$ 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. Um FINT -Fehler in Ihrem Projekt in den Namensspitzen zu erkennen, ist ein Cache erforderlich. Um CLJ-Kondo wissen zu lassen, wo Sie eines erstellen müssen, erstellen Sie ein .clj-kondo -Verzeichnis in der Wurzel Ihres Projekts, was bedeutet auf dem gleichen Niveau wie Ihr project.clj , deps.edn oder build.boot :
$ mkdir -p .clj-kondo Ein Cache wird darin erstellt, wenn Sie clj-kondo ausführen. Bevor Sie in Ihrem Editor gelegt werden, wird empfohlen, den gesamten Klassenpfad abzugeben, um clj-kondo über alle Bibliotheken zu unterrichten, die Sie verwenden, einschließlich Clojure und/oder Clojurescript selbst. Einige Bibliotheken sind mit Konfigurationen ausgestattet. Um sie zu importieren, rennen Sie zuerst:
$ clj-kondo --lint " <classpath> " --dependencies --copy-configs --skip-lint Das Flag --copy-configs Flag sucht und kopiert Konfigurationen aus Abhängigkeiten in das Verzeichnis .clj-kondo , während sie das Lining (siehe config.md).
Mit den vorhandenen Konfigurationen können wir jetzt die Abhängigkeiten ordnungsgemäß analysieren:
$ clj-kondo --lint " <classpath> " --dependencies --parallel Das Flag --dependencies zeigt an, dass CLJ-Kondo zur Analyse von Quellen verwendet wird, um den Cache zu füllen. Wenn CLJ-Kondo aktiviert ist, unterdrückt er Warnungen und überspringt bereits ausgegebene .jar Dateien für die Leistung.
Mit der --parallel werden mehrere Threads verwendet, um Ihre Quellen abzuspottet und sie schneller durchzugehen.
HINWEIS: In der Version nach 2024.05.24 Kopieren von Konfigurationen und Lining -Abhängigkeiten können auf einmal erfolgen.
$ clj-kondo --lint " <classpath> " --dependencies --parallel --copy-configsErstellen Sie Toolspezifische Möglichkeiten, um einen Klassenpfad zu erhalten:
lein classpathboot with-cp -w -f -clojure -Spathnpx shadow-cljs classpath Für lein wäre der gesamte Befehl also:
$ clj-kondo --lint "$(lein classpath)" --dependencies --parallel --copy-configs
Jetzt sind Sie bereit, einzelne Dateien mithilfe der Editor -Integration abzugeben. Eine Simulation dessen, was passiert, wenn Sie eine Datei in Ihrem Editor bearbeiten:
$ echo ' (select-keys) ' | clj-kondo --lang cljs --lint -
<stdin>:1:1: error: Wrong number of args (0) passed to cljs.core/select-keys Da Clj-Kondo jetzt über Ihre Version von ClojureScript über den Cache kennt, wird festgestellt, dass die Anzahl der Argumente, die Sie an select-keys übergeben haben, ungültig ist. Jedes Mal, wenn Sie eine Datei bearbeiten, wird der Cache schrittweise aktualisiert, sodass Clj-Kondo über neue Funktionen informiert ist, die Sie gerade geschrieben haben.
Wenn Sie ein anderes Verzeichnis zum Lesen und Schreiben des Cache verwenden möchten, verwenden Sie die Option --cache-dir . Verwenden Sie, um den Cache zu deaktivieren, auch wenn Sie ein .clj-kondo -Verzeichnis haben --cache false .
Beendencodes können von der Option- --fail-level <level> gesteuert werden. Die Standard -Fail -Level warnt warning , die wie folgt die Beschließungscodes zurückgibt:
0 : Es wurden keine Fehler oder Warnungen gefunden2 : Eine oder mehrere Warnungen wurden gefunden3 : Ein oder mehrere Fehler wurden gefunden Wenn --fail-level error geliefert wird, führen Warnungen nicht zu einem Exit-Code ungleich Null:
0 : Es wurden keine Fehler gefunden0 : Eine oder mehrere Warnungen wurden gefunden3 : Ein oder mehrere Fehler wurden gefunden Alle anderen Exit-Codes als 0 , 2 und 3 geben einen Fehler an, da ein Fehler in CLJ-Kondo oder ein anderer unerwarteter Fehler über die Kontrolle von CLJ-Kondo hinausgeht.
Da Clj-Kondo ein statischer Analysator ist, benötigt keine Laufzeit (JVM, Browser, Node.js usw.). Es führt Ihren Code nicht aus. Als solches kann es eine schnellere Alternative zu Lintern sein, die eine Laufzeit wie Eastwood verwenden. Dieser Ansatz kommt mit der Einschränkung, dass CLJ-Kondo Ihre Makros nicht ausführen kann, da Makros beliebige Funktionen aus einer Laufzeit verwenden können. CLJ-Kondo unterstützt Clojure-Kern-Makros und einige beliebte Bibliotheken aus der Community. Makros, die nicht außerhalb der Box unterstützt werden, können mithilfe der Konfiguration unterstützt werden. Eine der Möglichkeiten, Makros zu konfigurieren, besteht darin, Hooks für sie zu schreiben (siehe auch diesen Blogpost). Für viele Bibliotheken gibt es bereits eine Konfiguration, die Sie importieren können. Schauen Sie sich auch die CLJ-Kondo-Konfigurationen an, die Konfigurationen für Bibliotheken Dritter enthält.
Clj-Kondo kann als Babashka-Pod aufgerufen werden.
#! /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 und InspirationCopyright © 2019 - 2023 Michiel Borkent
Unter der EPL -Lizenz verteilt, wie Clojure. Siehe Lizenz.
Das inlined Verzeichnis enthält die Quelle aus tools.reader , die unter der EPL -Lizenz lizenziert ist.
Der parser enthält modifizierte Quelle von rewrite-clj , die unter der MIT-Lizenz lizenziert wird.