読者です 読者をやめる 読者になる 読者になる

(define -ayalog '())

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

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 でした。

*1: set-env! の source-paths はコンパイルが必要なソースのパスで resource-paths はコンパイルが不要でそのまま target にいれたいソースコードが置いてあるディレクトリです。今回は aot タスクの実行がないので resource-paths に src などを定義している前提だということが分かります

*2:ここでは上述の foo/bar ライブラリの 1.2.3-SNAPSHOT です