Boot で Leiningen のような Checkout dependencies を実現する
これは Leiningen 同様 Boot のデフォルトタスクで実現出来るのですが、ちょこっと手間があるので解説。
Leiningen の Checkout Dependencies については前に触れたのでそちらを参照ください。
とりあえず、ドキュメントを読む。
boot.user=> (doc checkout) ------------------------- boot.task.built-in/checkout ([& {:keys [help dependencies], :as *opts*}]) Checkout dependencies task. This task facilitates working on a project and its dependencies at the same time, by extracting the dependency jar contents into the fileset. Transitive dependencies will be added to the class path automatically. You'll need at least two boot instances---one to build the dependency jar and the other to build the project. For example: $ boot watch pom -p foo/bar -v 1.2.3-SNAPSHOT jar install to build the dependency jar, and $ boot repl -s watch checkout -d foo/bar:1.2.3-SNAPSHOT cljs serve to build the project with the checkout dependency [foo/bar "1.2.3"]. Keyword Args: :help bool Print this help info. :dependencies [[sym str]] The vector of checkout dependencies. nil
Leiningen のように前準備として何かが必要というわけではなくて、 Boot のインスタンスがふたつは最低でも必要というのが Leiningen と違うところでしょうか。
実際にドキュメントの中でやっている例をみると
$ boot watch pom -p foo/bar -v 1.2.3-SNAPSHOT jar install
まず、これはライブラリプロジェクト配下で実行されるタスクですね。恐らく build.boot に set-env! を使って :resource-paths なりを指定して src 配下を target に含まれるようにしていると思います*1。
watch 以降のタスクはファイルの変更をキャッチする度に実行されるタスクですので、ライブラリのディレクトリ以下でファイルの変更があった場合 pom -> jar -> install という順番で実行されることが分かります。
次にふたつ目の boot のコマンドをみてみます。
$ boot repl -s watch checkout -d foo/bar:1.2.3-SNAPSHOT cljs serve
ライブラリを依存性に含める側のプロジェクトで REPL をサーバーとして起動しています。 watch の後は checkout タスクがきています。これが変更をキャッチしたあとにライブラリをリロードしてくれる部分です。 -d オプションで依存するライブラリを指定します*2。そのあとのふたつは今回あまり関係ありませんが cljs のコンパイルと何故か http サーバーの起動です(このタイミングで起動するのはダメな気が、 watch 以前じゃないと複数起動されませんか?)。
ちなみにここでは言及されていませんが、これに対応するクライアントは例えば次のように起動できます。
$ boot repl -c
で、実際にはこの REPL を使って開発したりすると思いますが、ライブラリの変更を受けたあとに自動的にライブラリがインストールされ、プロジェクトは自動的にその変更を察知してライブラリを更新するまではいいんですが、 REPL のクライアントからプロジェクトのリロードを行う必要があります。
リロードについては前にも言及しているのでそちらを参照してください。
というところで Boot で Checkout dependencies でした。