Open1

Clojure CLI

gpsoftgpsoft

Clojure CLI(Command Line Interface)

Clojure CLIとは?

  • Clojureプログラムを動かすための実行環境
  • コマンドラインで使う、clojureコマンドとcljコマンド
  • Clojureの実行環境は、実はJavaプログラム
    • 各種Javaライブラリを使うことができる
      • Maven
      • GitHub
      • ローカルドライブ
    • JVM(Java VM)が必要
      • JVMは、Javaプログラムの実行環境
      • JVMを実行するとき、classファイルの置き場を示す「クラスパス(classpath)」がカギ
  • Clojure CLIは、外部ライブラリのダウンロードやJVMの起動などの面倒を見てくれる

コマンド

clojure [clj-opt*] [exec-opt]
clj [clj-opt*] [exec-opt]
  • clojurecljは、ほとんど同じ
  • 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