
Penganalisa dan linter statis untuk kode clojure yang memicu kegembiraan.

Terima kasih banyak untuk CLJ-Kondo. Ini seperti teman bagi saya. Itu membuat Clojure menyenangkan lagi.
- @Geridodev di Clojurians Slack
Clj-Kondo melakukan analisis statis pada Clojure, Clojurescript dan Edn. Ini memberi tahu Anda tentang kesalahan potensial saat Anda mengetik (tanpa melaksanakan program Anda).
CLJ-Kondo mendeteksi:
def Inlinedo dan let pembungkuslet dan letfn lokalrecur )clojure.test/deftestSebelum formulir Anda mengenai repl.
Ini menyarankan beberapa rekomendasi panduan gaya, seperti:
:else sebagai ekspresi uji catch-all di cond (lihat panduan gaya clojure)seq sebagai ganti (not (empty? ,,,)) (lihat Panduan Gaya Clojure)
Ini memiliki dukungan untuk sintaks makro yang umum digunakan seperti clojure.core.async/alt!! , schema.core/defn dan potemkin/import-vars .
Ini mendeteksi kesalahan umum di deps.edn dan bb.edn
Ini menyediakan data analisis sehingga Anda membangun linter khusus Anda sendiri.
Lihat semua linter yang tersedia di sini.
Linter ini adalah:
.clj , .cljs , .cljc dan .ednCobalah Clj-Kondo di taman bermain interaktif.
Tonton pembicaraan:
Anda dapat mendukung proyek ini melalui sponsor GitHub, OpenCollective, Ko-Fi atau secara tidak langsung melalui Clojurists bersama-sama.
Lint dari Stdin:
$ echo ' (def x (def x 1)) ' | clj-kondo --lint -
<stdin>:1:8: warning: inline defLint sebuah file:
$ echo ' (def x (def x 1)) ' > /tmp/foo.clj
$ clj-kondo --lint /tmp/foo.clj
/tmp/foo.clj:1:8: warning: inline defLint direktori:
$ 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 Project Classpath:
$ clj-kondo --lint " $( lein classpath ) "Membantu:
$ 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. Untuk mendeteksi kesalahan serat di seluruh ruang nama dalam proyek Anda, diperlukan cache. Untuk memberi tahu Clj-Kondo di mana membuat satu, membuat direktori .clj-kondo di akar proyek Anda, yang berarti pada tingkat yang sama dengan project.clj Anda.clj, deps.edn atau build.boot :
$ mkdir -p .clj-kondo Cache akan dibuat di dalamnya saat Anda menjalankan clj-kondo . Sebelum berbaris di dalam editor Anda, disarankan untuk meletakkan seluruh classpath untuk mengajar clj-kondo tentang semua perpustakaan yang Anda gunakan, termasuk Clojure dan/atau ClojureScript itu sendiri. Beberapa perpustakaan dilengkapi dengan konfigurasi. Untuk mengimpornya, pertama -tama jalankan:
$ clj-kondo --lint " <classpath> " --dependencies --copy-configs --skip-lint Bendera --copy-configs akan mencari dan menyalin konfigurasi dari dependensi ke direktori .clj-kondo , saat berbaris (lihat config.md).
Dengan konfigurasi yang ada, sekarang kita dapat menganalisis ketergantungan dengan benar:
$ clj-kondo --lint " <classpath> " --dependencies --parallel Bendera --dependencies menunjukkan bahwa CLJ-Kondo digunakan untuk menganalisis sumber untuk mengisi cache. Saat diaktifkan, CLJ-Kondo akan menekan peringatan dan melompati file .jar yang sudah dicat untuk kinerja.
Opsi --parallel akan menggunakan beberapa utas untuk meletakkan sumber Anda, melewati mereka lebih cepat.
CATATAN: Dalam versi setelah 2024.05.24 menyalin konfigurasi dan dependensi berbaris dapat dilakukan dalam sekali jalan menggunakan:
$ clj-kondo --lint " <classpath> " --dependencies --parallel --copy-configsMembangun cara khusus alat untuk mendapatkan classpath:
lein classpathboot with-cp -w -f -clojure -Spathnpx shadow-cljs classpath Jadi untuk lein seluruh perintahnya adalah:
$ clj-kondo --lint "$(lein classpath)" --dependencies --parallel --copy-configs
Sekarang Anda siap untuk memasukkan file tunggal menggunakan integrasi editor. Simulasi apa yang terjadi saat Anda mengedit file di editor Anda:
$ echo ' (select-keys) ' | clj-kondo --lang cljs --lint -
<stdin>:1:1: error: Wrong number of args (0) passed to cljs.core/select-keys Karena Clj-Kondo sekarang tahu tentang versi Clojurescript Anda melalui cache, ia mendeteksi bahwa jumlah argumen yang Anda lewati untuk select-keys tidak valid. Setiap kali Anda mengedit file, cache diperbarui secara bertahap, jadi CLJ-Kondo diinformasikan tentang fungsi baru yang baru saja Anda tulis.
Jika Anda ingin menggunakan direktori yang berbeda untuk membaca dan menulis cache, gunakan opsi --cache-dir . Untuk menonaktifkan cache bahkan jika Anda memiliki direktori .clj-kondo , gunakan --cache false .
Kode keluar dapat dikontrol oleh opsi --fail-level <level> . Level gagal default adalah warning yang mengembalikan kode keluar sebagai berikut:
0 : Tidak ada kesalahan atau peringatan yang ditemukan2 : satu atau lebih peringatan ditemukan3 : satu atau lebih kesalahan ditemukan Jika --fail-level error disediakan, peringatan tidak mengarah pada kode keluar yang tidak nol:
0 : Tidak ada kesalahan yang ditemukan0 : satu atau lebih peringatan ditemukan3 : satu atau lebih kesalahan ditemukan Semua kode keluar selain 0 , 2 dan 3 menunjukkan kesalahan karena bug di CLJ-Kondo atau kesalahan tak terduga lainnya di luar kendali CLJ-Kondo.
Karena CLJ-Kondo adalah penganalisa statis tidak perlu runtime (JVM, browser, node.js, dll.). Itu tidak menjalankan kode Anda. Karena itu bisa menjadi alternatif yang lebih cepat untuk linter yang menggunakan runtime, seperti Eastwood. Pendekatan ini hadir dengan batasan bahwa CLJ-Kondo tidak dapat menjalankan makro Anda karena makro dapat menggunakan fitur sewenang-wenang dari runtime. CLJ-Kondo mendapat dukungan untuk Macro Clojure Core dan beberapa perpustakaan populer dari komunitas. Makro yang tidak didukung di luar kotak dapat didukung menggunakan konfigurasi. Salah satu cara untuk mengkonfigurasi makro adalah dengan menulis kait untuk mereka (juga lihat posting blog ini). Untuk banyak perpustakaan sudah ada konfigurasi yang tersedia yang dapat Anda impor. Lihat juga CLJ-Kondo Configs yang berisi konfigurasi untuk pustaka pihak ketiga.
CLJ-Kondo dapat dipanggil sebagai 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 dan inspirasiHak Cipta © 2019 - 2023 Michiel Borkent
Didistribusikan di bawah lisensi EPL, sama seperti Clojure. Lihat lisensi.
Direktori inlined berisi sumber dari tools.reader .
parser direktori berisi sumber yang dimodifikasi dari rewrite-clj yang dilisensikan di bawah lisensi MIT.