Clojure 開発環境まとめ
Clojure開発をするときの開発環境(DX)向上のあれこれ.
主にClojure開発に関わるツールやライブラリまとめ.
- RDDはこちら: 📝Clojure REPL Driven Development
- Debugはこちら: 📝Clojure デバッグ
- リファクタリング: Clojureリファクタリング
- Emacsに特化したものを別ノートに移動:
- ClojureScriptはこっち: 📝ClojureScript開発環境
Editor
🔧VSCode Calva
📝VSCodeのClojure開発環境.
- https://calva.io/
- The Top 10 Commands - Calva User Guide, はじめに覚えたい10のショートカット.
move
- Ctrl+Alt+o o/r: REPLに移動, Ctrl+x o で戻る
eval
- Ctrl+Enter: current line
- Alt+Enter: top level
- Ctrl+Alt+c+Enter: current file
- calva: toggle keybindings enabled
<2024-12-29 Sun 10:03>
これがtoggleされているとcalvaが動かない(ハマった)
paredit
- ctrl+alt+shift+backspace, unwrap
<2025-02-27 Thu 14:09>
これ探しててなかなか分からなかった.
カラーテーマが貧弱
borealis-theme - Visual Studio Marketplace, これがいい.
Outputs
- repl-window: output-file, ctrl+alt+o+r
- output-channe: calva says, ctrl+alt+o+c
"calva.outputDestinations": {
"evalResults": "output-channel",
"evalOutput": "output-channel",
"otherOutput": "output-channel"
}
🔧Clojure: Leiningen
Clojure Build tool.
https://github.com/technomancy/leiningen
Clojureプロジェクト管理ツール. make的な.
howto: Java外部ライブラリをいれるには?
[/ ] という記法でproject.cljのdependenciesに追加.
これが,
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-firestore</artifactId>
<version>3.0.2</version>
</dependency>
こうなる.
[com.google.cloud/google-cloud-firestore "3.0.2"]
howto: lein uberjarでThe Main-Class specified does not exist within the jar
main の core.cljのnsに(:gen-class)を追加.
Warning: The Main-Class specified does not exist within the jar. It may not be executable as expected. A gen-class directive may be missing in the namespace which contains the main method, or the namespace has not been AOT-compiled.
tips: project.cljにビルド用設定のみ書いて設定情報はenvironやconfigをつかう
よい.
ref: https://twitter.com/t_yano/status/1163413764827303937
🔧clojure.cli(tools.deps)
Clojureのビルドツール.
https://clojure.org/reference/deps_and_cli
基本的には paths/dependencies/aliasesだけ覚えれば基本はできる. leiningenより学習コストは低. leiningenよりシンプルであることが特徴.
🔧clj/clojure
cljとclojureの2つのコマンドがある.
- cljコマンドでREPL起動.
- clojureコマンドで .cljファイルを実行.
Rich Hickeyがこれから熱意を入れたいとか. 2022でメジャーなのはleiningenであるもののこれから逆転の可能性はある.
-Jをつけることで, JVM起動オプションを指定可能.
$ clj -A:bot -J-XX:+UnlockExperimentalVMOptions -J-XX:+UseZGC
🔧deps.edn
deps.ednファイルで記述.
ref. https://clojure.org/reference/deps_and_cli#_operation
- pathsにclojureのコードのrootからの相対パスを記述.
- dependenciesに依存ライブラリを記述.
- aliasesにcustom command を記述.
- たとえば clj (-X/-M/-A):hogehoge のようなオプションを気軽に定義できる.
- -M: mainプログラム起動
- -T: ツール起動
- -X: 関数起動
- -A: alias起動.
- たとえば clj (-X/-M/-A):hogehoge のようなオプションを気軽に定義できる.
tips: JVMのオプションを起動で指定するには?
:jvm-optsを指定して, -X, -A, -Mで起動.
tip: GitHubの最新バージョンを参照するには?
mvn/versionでタグを参照するのではなく(バグ修正とかで)最新バージョンを使いたいときのtip.
{:deps }の中で, io.github.(user)/(project) がkey, {:git/sha “xx”}が valueで宣言する.
io.github.dm3/clojure.java-time
{:git/sha "693dffad2343cd9722482a5f200efe75dfbfbd31"}
ただしこの技はdeps.ednを含むprojectでしか使えない(leiningenではつかえない).
clj -X:my-funのargsは1つのみ
clj -Xで実行する関数の引数は1つのみで. 複数をわたしたいときはMapにする.
🔧tools.build
Clojureプロジェクトのビルドツール
jar/uberjarの作成には tools.buildをつかうのが今風(2022~)
refs:
- https://clojure.org/news/2021/07/09/source-libs-builds
- https://github.com/seancorfield/depstar (~2021)
- fogus: Clojure builds as an amalgamation of orthogonal parts
tools.tools
他人のつくったlibをClojure CLI ifに簡単に組み込むことができる.
🔗References
- Clojure + deps.edn, a basic guide | Tomek Wałkuski
- clojure CLI (tools.deps)を使いやすくするためのTips - Qiita
- Clojure CLIでClojarsにデプロイする - Qiita
🔧cljstyle
Clojureフォーマッタ.
先発のcljfmtはleiningen縛り. cljstyleはスタンドアロンバイナリとして動作する.
- https://github.com/greglook/cljstyle
- Clojureのフォーマッターcljstyleの使い方 - TOYOKUMO Tech Blog
- Clojure開発環境でのフォーマッターcljstyle設定まとめ - Qiita
- Clojure formatting with cljstyle | Andrey Bogoyavlensky
以下, Doom Emacsの設定例. format-allというpackageの clojure custom formatterとしてcljstyleを設定して, 保存時にフックでフォーマットが走るようにする.
(add-hook! clojure-mode
(set-formatter! 'cljstyle "cljstyle pipe" :modes '(clojure-mode))
(add-hook 'before-save-hook 'format-all-buffer t t))
ref: 🔖Formatter 📝Clojureコーディング規約
🔧clj-kondo
Clojure リンター. Clojure用の静的解析ツール.
スタンドアロンバイナリとして動作するのでleiningenやREPLに依存しない.
- https://github.com/clj-kondo/clj-kondo
- Clojure開発環境でのリンターclj-kondo, Joker設定まとめ - Qiita
- clj-kondo Hooks入門
- https://github.com/borkdude/flycheck-clj-kondo
- Live Linting · Clojure development with Spacemacs & Cider
ref: 🔖Linter
マクロで定義する類のシンボルでunresolved symbolのclj-kondo警告が出る
未定義シンボルに対する警告は期待通りだが, マクロで生成する類のものには警告はでてほしくない. declare をつかうことで明示的に教えてあげる.
(declare select-things)
👉Related
- up: 📂Clojure Development
- tags: 🔖Clojure