📝
tools.build 勉強メモ
tools.build Guide をみながら、とりあえず今自分に必要なところだけメモしていきます。自分用メモなので雑です。ご了承ください。
1. かんたんなアプリケーションをBUILDする
1.1. ディレクトリ構成
├── build.clj
├── deps.edn
├── src
│ └── myapp
│ └── core.clj
deps.edn
1.2. {: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
- 以下2つにうちどちらかを入れる
-
:ns-compile
:この順序で名前空間をコンパイルする(今回は一つしか入っていないだけ) -
:src-dirs
:ソースが入っているディレクトリ(つまり["src"]
)
-
- 以下2つにうちどちらかを入れる
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. 参照
- Clojure - tools.build Guide - https://clojure.org/guides/tools_build
- clojure.tools.build.api https://clojure.github.io/tools.build/
Discussion