日曜プログラミング

休日趣味でやってるプログラミング関連記事をダラダラと

leiningen プロジェクトでのパッケージング

leiningen プロジェクトで作ったプログラムの配布について。

ライブラリであれば標準で lein deploy が用意されてるが(使った事ないけど)、スタンドアロンア プリとして本体の jar の他にマニュアルなどのドキュメントを jar には含めずに 書庫ファイ ルに固めて配布したい時どうするか。

今の所の自分の結論としては、フォルダ構成がそこまで複雑でなければ lein-pprintとバッチス クリプト(Unix 系だとシェルスクリプトか)を組み合わせるのがまずはお手軽かなと。

lein-pprint を使うのは project.clj に書いてあるプロジェクト名とバージョン情報をバッチに渡 したいと言うのがな主目的。

lein-pprint は引数なしだとプロジェクト情報の全てを map で表示するが、 追加引数で特定の keyword を指定する事で、その keyword に関する情報のみ出せる。

C:\lein_projects\sandbox>lein pprint :name
"sandbox"
C:\lein_projects\sandbox>lein pprint :version
"0.1.0-SNAPSHOT"

で、このコマンド結果をバッチで使いたい場合、(裏技的だが)以下のリンク先情報にある for 文内 で使えるコマンド結果展開を使えば可能。

ただし、lein 生コマンド実行結果サンプルにある通り、keyword の値が文字列の時ダブルクォーテ ーションで囲まれた結果が返ってくる為、そいつを取り除くのにもう一手間必要になる。

こちらもバッチでは for 内の変数を加工展開する機能があり、%%~I とチルダを付けて展開すれば取 り除いてくれる。

これで lein uberjar までは leiningen にお任せし、適当な CLI を持つアーカイブツールを使えば 書庫に固められる。

余談

この結論にたどり着く前に、プロジェクト情報を流用したくてシェルを呼び出せる leiningen プラ グインである lein-shellを試してたのだが、今回結 局断念したハマりポイントを書き留めておく。

  • このプラグインで :aliases でシェルを呼び出せるようにははなるが leiningen のプロジェクト マップ情報は参照できない
    • 元々 :aliases のエントリがそういうもの?ここはちょっと良く分からない
  • ビルド時に使うメモリサイズが大きすぎる為か、:aliases で lein clean & uberjar をまとめると 単体で lein uberjar してた時には出なかったメモリ不足を示す JavaVM 起動エラーが出る。
  • echo とかのコマンドプロンプトに内蔵されてるものはそもそも Java から直接呼び出せない。
    • これ自体は /c オプション付けたら別コマンドプロンプト立ち上げる形で対応できるが (参考)、 そうした場合に環境変数が引き継がれないのが難点。
    • これは Java では外部プロセスを起動する形になってるためどうしようもない。

ただ、バッチでできる部分では素直にバッチで、そんでそのバッチスクリプトを leininge のタスク の一部としてエイリアスにする分には lein-shell プラグインは依然として使えると思うので自分 の profile.clj には残しておく。

まあ leiningen は元々パッケージングをする目的では作られてないからこの余談で試してた部分は 少しムリがあったかなとちょっと自省。

インストーラ作成ソフトを使いたくなるほどの規模になる場合はまたその時調べると言う事で。