clojure repl 内でプロジェクト情報を取得することは可能ですか?
たとえば、定義されたプロジェクトがあった場合:
(defproject blahproject "0.1.2" ....)
プロジェクトディレクトリでreplを実行するとき、このような機能はありますか?
> (project-version)
;=> 0.1.2
自分自身を解析することはできますがproject.clj
、これは面倒かもしれません。大変な作業でもあります。代わりに、次のことができます。
(System/getProperty "projectname.version")
システムプロパティを含む多くのソースから設定を吸い込む環境 ( https://github.com/weavejester/environ ) を使用します。プロジェクトのバージョンは次のように表示され:<project-name>-version
ます。
foobar.repl=> (require '[environ.core :refer [env]])
nil
foobar.repl=> (:foobar-version env)
"0.1.0-SNAPSHOT"
以下のコードを project.clj の末尾に追加します。
(def project (assoc-in project [:repl-options :init]
`(~'def ~'project-version ~(project :version))))
project-version
これで、repl の初期名前空間で呼び出される var ができました。
より完全な機能を備えたアプローチについては、Leiningen の configleaf プラグイン ( https://github.com/davidsantiago/configleaf ) を参照してください。これにより、アクティブなプロファイルがマージされたプロジェクト マップが作成され、選択した名前空間のプロジェクト コードで使用できるようになります。
vemvが言ったように、Leiningen プロジェクト ファイルは単なる Clojure データです。したがって、通常のようにプロジェクトに簡単にアクセスできますhash-map
。
(->> "project.clj"
slurp
read-string
(drop 2)
(cons :version)
(apply hash-map)
(def project))
この変数が でのみ必要な場合は、次のrepl
ように追加できrepl-options
ますproject.clj
。
(defproject yourproject "0.1.0"
:description ""
:url ""
:dependencies [ [org.clojure/clojure "1.4.0"]]
:repl-options { :init (->> "project.clj"
slurp
read-string
(drop 2)
(cons :version)
(apply hash-map)
(def project))})
これで、にproject
変数ができましたrepl
。したがって、プロジェクトのバージョンにアクセスするには、単に(:version project)
.
もちろん、ネイティブの Leiningen コードを使用してプロジェクト ファイルを解析することもできます。
(defproject yourproject "0.1.0"
:description ""
:url ""
:dependencies [ [org.clojure/clojure "1.4.0"]
[leiningen-core "2.1.3"]]
:repl-options { :init (do (require 'leiningen.core.project)
(def project
(leiningen.core.project/read)))})
ただし、プロジェクトのバージョンだけが必要な場合は、Ankur のソリューションを使用することをお勧めします。