Open1
Clojure CLI
Clojure CLI(Command Line Interface)
Clojure CLIとは?
- Clojureプログラムを動かすための実行環境
- コマンドラインで使う、
clojure
コマンドとclj
コマンド - Clojureの実行環境は、実はJavaプログラム
- 各種Javaライブラリを使うことができる
- Maven
- GitHub
- ローカルドライブ
- JVM(Java VM)が必要
- JVMは、Javaプログラムの実行環境
- JVMを実行するとき、
class
ファイルの置き場を示す「クラスパス(classpath)」がカギ
- 各種Javaライブラリを使うことができる
- Clojure CLIは、外部ライブラリのダウンロードやJVMの起動などの面倒を見てくれる
コマンド
clojure [clj-opt*] [exec-opt]
clj [clj-opt*] [exec-opt]
-
clojure
とclj
は、ほとんど同じ -
clj
は、REPLの操作に都合が良いようになっている
例:
clj -M:dev
clj -M -m myapp.core
clojure -T:build uber
コンフィグ情報
あなたからClojure CLIに伝えるべきこと。
- 何をしたいか?
- あなたのソースファイルがどこにあるか?
- どんな外部ライブラリを使いたいか?
- などなど
伝える方法は…
-
deps.edn
ファイル- ログインユーザ固有の設定は、
$HOME/.clojure/deps.edn
- プロジェクト固有の設定は、プロジェクトディレクトリ直下の
deps.edn
- ログインユーザ固有の設定は、
- コマンドの引数
これらをマージして、最終的なコンフィグ情報を構築する。
deps.ednファイル
コンフィグ情報をマップで記述する。
トップレベルのキーは3つ。
-
:paths
…あなたのソースファイルがどこにあるか? -
:deps
…どんな外部ライブラリを使いたいか? -
:aliases
…エイリアス名とコンフィグ情報のマップ(ケースバイケースで適用したい情報を記述)
{:paths ["src" "resources"]
:deps {ring/ring-core {:mvn/version "1.9.6"}
ring/ring-jetty-adapter {:mvn/version "1.9.6"}}
:aliases
{:dev {:extra-deps {nrepl/nrepl {:mvn/version "1.0.0"}}
:extra-paths ["dev"]}
:build {:extra-deps
{io.github.clojure/tools.build
{:git/tag "v0.9.4" :git/sha "76b78fe"}}
:ns-default build}}}
エイリアス
- エイリアス名は自由だが、
:deps
エイリアスは予約されてるっぽい -
:extra-paths
…トップレベルの:paths
に付け足す -
:extra-deps
…トップレベルの:deps
に付け足す -
:ns-default
…デフォルトの名前空間。コマンドライン引数に関数名を指定するとき名前空間を省略できる
何をしたいか?
exec-opt
引数により、「何をしたいか?」を伝える。中心的な機能は4つ。
-
-A
: allのA? 昔の名残? REPLを実行する -
-M
: mainのM。clojure.main/main
を実行する -
-X
: executeのX。任意の関数を実行する -
-T
: toolのT。各種の「ツール」を実行する
exec-opt
に続けてエイリアス名を指定すると(-M:dev
や-T:build:hoge:fuga
など)、deps.edn
に記述したコンフィグ情報を適用することができる。
補助的な機能が2つ。
-
-Sdescribe
: 最終的なコンフィグ情報を表示する -
-Spath
: クラスパスを表示する
exec-opt
と組み合わせて使うもの…
-
-S
: sourceのS。最終的なコンフィグ情報を調べたり調整する-
-Sverbose
:deps.edn
の入手ルートを表示する -
-Srepro
: ログインユーザ固有のdeps.edn
を無視する -
-Sforce
: コンフィグ情報のキャッシュを無視する -
-Scp
: クラスパスをコマンドラインで明示する -
-Sdeps
: ???
-
-
-P
: prepareのP。準備のみ。exec-opt
の実行手前まで実施する -
-J
: javaのJ。JVM(java
コマンド)へオプションを渡す
REPLを実行する(-A)
clj
clj -A:hoge
REPLを開始するには、単にclj
コマンドを実行するか、-A
オプションにエイリアス名を指定する。
clojure.main/mainを実行する(-M)
clj -M:dev
clojure -M -m myapp.core
- Clojure組み込みの関数
clojure.main/main
を呼び出す-
clojure.main/main
は、アプリやREPLを起動するプリミティブな手段 -
clojure
/clj
コマンドは、clojure.main/main
のラッパ的存在
-
-
-M
オプションの後続の引数は、そのままclojure.main/main
関数の引数になる- あるいは、コンフィグ情報の
:main-opts
で指定
- あるいは、コンフィグ情報の
関数を実行する(-X)
clojure -X:test myapp.core/run-test :arg1 100 :arg2 test.log
-
-X
オプションにより、任意の関数を呼び出す- 呼べるのは、arity=1の関数のみ
- 引数はマップ
- 関数と引数は、コンフィグ情報の
:exec-fn
と:exec-args
でも指定可能
組み込みエイリアス
Clojure組み込みの:deps
エイリアスを通して、関数が提供されている。
clojure -X:deps list # プロジェクトの依存ライブラリを表示。
clojure -X:deps tree # プロジェクトの依存ライブラリをツリーで表示。
clojure -X:deps aliases # エイリアスの一覧を表示。
clojure -X:deps mvn-pom # pom.xmlを生成。
clojure -X:deps git-resolve-tags # gitのライブラリのSHA値を調べてdeps.ednを更新。
clojure -X:deps find-versions # 外部ライブラリや「ツール」のバージョンを調べる。
clojure -X:deps help/dir :ns clojure.pprint # publicな関数の一覧を表示。
clojure -X:deps help/doc :fn clojure.pprint/pprint # 関数のdoc-stringを表示。
「ツール」を実行する(-T)
ここで言う「ツール」は、プロジェクトとは独立した存在。Clojure組み込みツールの場合もあれば、ユーザが用意したツールの場合もある。ツールの実体はClojureの関数。
clojure -T:build uber
clojure -T build/uber
-
-T
オプションにより、ツールを実行する- ツールの実体は関数なので、
-X
と似ている
- ツールの実体は関数なので、
- プロジェクトのコンフィグ情報の
:paths
と:deps
は無視される- だから、ツール用のエイリアスの中では
:extra-deps
じゃなくて:deps
を使うのが一般的?
- だから、ツール用のエイリアスの中では
- デフォルトで、カレントディレクトリが
:paths
に設定される
toolsツール
Clojure CLIには、toolsという名前のツールが標準で付いている。toolsツールは、ツールを管理(インストールなど)するためのツール。ツールを使う場合、-T
オプションには、エイリアス名の変わりにツール名(tools
)を指定する。
clojure -Ttools install ... :as hoge
clojure -Ttools install-latest ... :as hoge
clojure -Ttools list
clojure -Ttools remove :tool hoge
clojure -Ttools show :tool hoge