📝

tools.build 勉強メモ

2024/08/04に公開

tools.build Guide をみながら、とりあえず今自分に必要なところだけメモしていきます。自分用メモなので雑です。ご了承ください。

1. かんたんなアプリケーションをBUILDする

1.1. ディレクトリ構成

├── build.clj
├── deps.edn
├── src
│   └── myapp
│       └── core.clj

1.2. deps.edn

{:paths   ["src"]
 :deps    {org.clojure/clojure {:mvn/version "1.11.3"}}
;; ビルド設定は、エイリアスの中に作る。
 :aliases {:build {:deps       {io.github.clojure/tools.build {:git/tag "v0.10.5"
                                                               :git/sha "2a21b7a"}}
                   :ns-default build}}}
  • 忘れがちなClojure依存

1.3. プログラムソース

src/myapp/core.clj
(ns myapp.core
  (:gen-class))

(defn -main []
  (println "Hello Clojure!"))
  • 単にハロワというアプリを作成
  • uberjar + lib というアプリを作るには必ず以下2つを入れる
    • (:gen-class)
    • -main 関数

1.4. build.clj

  • project 直下に置く
build.clj
(ns build
  (:require [clojure.tools.build.api :as b]))

(def lib 'myapp)
(def version (format "1.2.%s" (b/git-count-revs nil))) ;; これを使うために git init / add / commit までしておく必要がある。でもやっときゃ便利。
(def class-dir "target/classes")
(def uber-file (format "target/%s-%s-standalone.jar" (name lib) version))

;;アプリケーションを作成する時に依存関係をDLするのがこの設定
(def basis (delay (b/create-basis {:project "deps.edn"})))

(defn clean [_]
  (b/delete {:path "target"}))

(defn uber [_]
  (clean nil)
  (b/copy-dir {:src-dirs   ["src" "resources"]
               :target-dir class-dir})
  (b/compile-clj {:basis      @basis ;; delay しているので @ が必要
                  :ns-compile '[myapp.core]
                  :class-dir  class-dir})
  (b/uber {:class-dir class-dir
           :uber-file uber-file
           :basis     @basis ;; delay しているので @ が必要
           :main      'myapp.core}))

compile-clj 関数

  • Clojureソースを :class-dirでコンパイルする
  • Required
    • :basis:コンパイルする時の基盤
    • :class-dir :クラスを書き込むディレクトリ
  • Option

create-basis 関数

  • プログラムの依存関係やエイリアスからプログラムのベースを作る関数。
  • この関数が依存関係のダウンロード等を行い、プログラムの基盤を作る。
  • この書き方を踏襲してよい(delay は必要に応じて入れたらよい)

1.5. 成果物作成

  • (オプション) : git-count-revs 関数を使う止めに git init / add / commit しておく必要がある
git init
git add 
git commit -m"any commit message"
  • uberjar ファイル作成
clj -T:build uber

1.6. 実行

# file 名は手元のものに合わせて
java -jar target/myapp-1.2.1-standalone.jar 

2. 参照

Discussion