(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

Boot で alembic てきな依存関係の動的解消(?)ぽいことをやる

最近 Boot を本格運用し始めて色々と質問されて調べたりする機会が出来たのでちょこちょこノウハウというか Tips 的な何かを書いていきたい。

alembic とは

github.com

まぁ Clojure やってる人なら使っている人も多いと思いますが、実行中の REPL に対して動的に依存性を追加出来るという代物です。

Boot で同じことをやる

Boot の場合はそれを最初から機能として持ってしまっているので新たに何か必要になるということはないです。

あまりこれはドキュメントの中で明示されていないような気がしますが、実際には set-env! や merge-env! がそもそもの機能として起動中の JVM インスタンスに対して何かしら足したりするようになっているのでできるようです。

(set-env! key val & kvs)
Sets the values for the given keys. Note that this may produce side effects, changes to the JVM's classpath, etc.
Boot Environment · boot-clj/boot Wiki · GitHub

It does amazing magical things like providing classpath isolation so that you can run multiple projects using one JVM and letting you add new dependencies to your project without having to restart your REPL.
Boot, the Fancy New Clojure Build Framework

ここでも REPL を再起動することなく依存性を追加出来ると書いてあるのでまちがいないでしょう。

実際にやる場合は例えば REPL で以下のような set-env! を評価すると良さそうです。

boot.user=> (set-env!
 :dependencies '[[clj-time "0.9.0"]])
       #_=> nil
boot.user=> (require '[clj-time.core :as t])
nil
boot.user=> (t/date-time 1991 05 29)
#<DateTime 1991-05-29T00:00:00.000Z>

もしくは build.boot を開いて編集しているなら set-env! の部分を REPL へと飛ばして評価するのもありでしょう。