
Статический анализатор и Линтер для кода Clojure, который вызывает радость.

Большое спасибо за CLJ-Kondo. Это как компаньон для меня. Это снова сделало Clojure.
- @geraldodev на Clojurians Slack
CLJ-Kondo выполняет статический анализ Clojure, Clojurescript и Edn. Он сообщает вам о потенциальных ошибках во время печати (без выполнения вашей программы).
CLJ-Kondo обнаруживает:
defdo и let оберткиlet и letfnrecur )clojure.test/deftestПеред тем, как ваша форма попадет в реплику.
Он предлагает несколько рекомендаций по руководству по стилю, таких как:
:else в качестве тестового выражения All в cond (см. Руководство по стилю Clojure)seq вместо (not (empty? ,,,)) (см. Руководство по стилю Clojure)
Он поддерживает синтаксис часто используемых макросов, таких как clojure.core.async/alt!! , schema.core/defn и potemkin/import-vars .
Он обнаруживает общие ошибки в deps.edn и bb.edn
Он предоставляет данные анализа, поэтому вы создаете свои собственные индивидуальные линии.
Просмотреть все доступные линтеры здесь.
Этот Линтер:
.clj , .cljs , .cljc и .edn файлыПопробуйте CLJ-Kondo на интерактивной игровой площадке.
Смотрите разговор:
Вы можете поддерживать этот проект с помощью спонсоров GitHub, Opencollective, KO-Fi или косвенно с помощью Clojurists вместе.
Ворс из Stdin:
$ echo ' (def x (def x 1)) ' | clj-kondo --lint -
<stdin>:1:8: warning: inline defОставьте файл:
$ echo ' (def x (def x 1)) ' > /tmp/foo.clj
$ clj-kondo --lint /tmp/foo.clj
/tmp/foo.clj:1:8: warning: inline defОчистить каталог:
$ 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-callsОставьте Project Classpath:
$ clj-kondo --lint " $( lein classpath ) "Помощь:
$ 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. Чтобы обнаружить ошибки Lint в пространствах имен в вашем проекте, необходим кэш. Чтобы CLJ-Kondo знал, где его создать, сделать каталог .clj-kondo в корне вашего проекта, что означает на том deps.edn уровне, что и ваш project.clj build.boot
$ mkdir -p .clj-kondo Кэш будет создан внутри него, когда вы запускаете clj-kondo . Перед тем, как выйти в ваш редактор, рекомендуется прокинуть весь путь к классу, чтобы научить clj-kondo обо всех библиотеках, которые вы используете, в том числе Clojure и/или сам Clojurescript. Некоторые библиотеки поставляются с конфигурациями. Чтобы импортировать их, сначала запустите:
$ clj-kondo --lint " <classpath> " --dependencies --copy-configs --skip-lint Флаг --copy-configs будет искать и копировать конфигурации из зависимостей в каталог .clj-kondo , в то время как Linting (см. Config.md).
С настройками конфигураций, теперь мы можем правильно проанализировать зависимости:
$ clj-kondo --lint " <classpath> " --dependencies --parallel Флаг --dependencies указывает, что CLJ-Kondo используется для анализа источников для заполнения кэша. При включении, CLJ-Kondo подавит предупреждения и пропускает уже изготовленные файлы .jar для производительности.
Паральница --parallel будет использовать несколько потоков, чтобы пробить ваши источники, проходя через них быстрее.
ПРИМЕЧАНИЕ. В версии после 2024.05.24 Копирование конфигураций и зависимостей с линитом можно сделать за один раз, используя:
$ clj-kondo --lint " <classpath> " --dependencies --parallel --copy-configsСоздайте инструмент конкретные способы получить путь к классу:
lein classpathboot with-cp -w -f -clojure -Spathnpx shadow-cljs classpath Так что для lein вся команда была бы:
$ clj-kondo --lint "$(lein classpath)" --dependencies --parallel --copy-configs
Теперь вы готовы прокинуть отдельные файлы, используя интеграцию редактора. Моделирование того, что происходит, когда вы редактируете файл в своем редакторе:
$ echo ' (select-keys) ' | clj-kondo --lang cljs --lint -
<stdin>:1:1: error: Wrong number of args (0) passed to cljs.core/select-keys Поскольку CLJ-Kondo теперь знает о вашей версии Clojurescript через кэш, он обнаруживает, что количество аргументов, которые вы передали select-keys неверно. Каждый раз, когда вы редактируете файл, кэш постепенно обновляется, поэтому CLJ-Kondo информируется о новых функциях, которые вы только что написали.
Если вы хотите использовать другой каталог для чтения и записи кэша, используйте опцию --cache-dir . Чтобы отключить кеш, даже если у вас есть каталог .clj-kondo , используйте --cache false .
Коды выхода могут контролироваться опцией --fail-level <level> . Уровень сбоя по умолчанию - это warning , которое возвращает коды выхода следующим образом:
0 : ошибок или предупреждений не найдено2 : одно или несколько предупреждений были найдены3 : были найдены одна или несколько ошибок Если понесена --fail-level error , предупреждения не приводят к ненулевой выходе:
0 : Ошибки не обнаружены0 : одно или несколько предупреждений были найдены3 : были найдены одна или несколько ошибок Все коды выхода, отличные от 0 , 2 и 3 указывают на ошибку из-за ошибки в CLJ-Kondo или какой-либо другой неожиданной ошибки за пределами управления CLJ-Kondo.
Поскольку CLJ-Kondo является статическим анализатором, не нуждается в среде выполнения (JVM, браузер, Node.js и т. Д.). Это не выполняет ваш код. Таким образом, это может быть более быстрой альтернативой Линтерам, которые используют время выполнения, такие как Иствуд. Этот подход поставляется с ограничением того, что CLJ-Kondo не может выполнить ваши макросы, поскольку макросы могут использовать произвольные функции со времени выполнения. CLJ-Kondo обладает поддержкой Clojure Core Macros и некоторых популярных библиотек из сообщества. Макросы, которые не поддерживаются из коробки, могут быть поддержаны с помощью конфигурации. Один из способов настроить макросы - это написать для них крючки (также см. Этот пост блога). Для многих библиотек уже есть конфигурация, которую вы можете импортировать. Также ознакомьтесь с CLJ-Kondo Configs, которые содержат конфигурации для сторонних библиотек.
CLJ-Kondo может быть вызван как капсул 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 и вдохновениеCopyright © 2019 - 2023 Michiel Borkent
Распределено по лицензии EPL, так же, как Clojure. Смотрите лицензию.
inlined каталог содержит источник от tools.reader , который лицензирован по лицензии EPL.
parser каталога содержит модифицированный источник от rewrite-clj , который лицензирован по лицензии MIT.