clojure repl内のプロジェクト情報を取得することは可能ですか?例えばreplで現在のclojureプロジェクトのバージョンを取得する
、定義されたプロジェクトがあった場合:
(defproject blahproject "0.1.2" ....)
は、プロジェクトディレクトリにREPLを実行している場合、このような機能はありますか?
> (project-version)
;=> 0.1.2
clojure repl内のプロジェクト情報を取得することは可能ですか?例えばreplで現在のclojureプロジェクトのバージョンを取得する
、定義されたプロジェクトがあった場合:
(defproject blahproject "0.1.2" ....)
は、プロジェクトディレクトリにREPLを実行している場合、このような機能はありますか?
> (project-version)
;=> 0.1.2
Leiningenをプロジェクトファイルには、ちょうどClojureのデータです:)
(-> "/path/to/project.clj" slurp read-string (nth 2))
この生成されたjarでは動作しません。 – radu122
'(some->(io/resource" project.clj ")slurp edn/read-string(nth 2))' – joelittlejohn
project.cljの最後に以下のコードを追加します。
(def project (assoc-in project [:repl-options :init]
`(~'def ~'project-version ~(project :version))))
今、あなたはVARを持っていますreplの最初の名前空間にはproject-version
と呼ばれています。
vemvと言っていますが、LeiningenのプロジェクトファイルはClojureのデータです。だから、それは普通のhash-map
としてプロジェクトにアクセスするのは簡単です:
(->> "project.clj"
slurp
read-string
(drop 2)
(cons :version)
(apply hash-map)
(def project))
あなただけのrepl
で、この変数が必要な場合は、あなたがあなたのproject.clj
にrepl-options
に追加することができます:今
(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))})
、あなたrepl
にproject
という変数があります。したがって、プロジェクトのバージョンにアクセスするには、(: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'sソリューションを使用するのが最善です。
もっと機能が豊富なアプローチについては、Leiningenのconfigleafプラグイン(https://github.com/davidsantiago/configleaf)をご覧ください。アクティブなプロファイルをマージしたプロジェクトマップを、選択した名前空間のプロジェクトコードで使用できるようにします。
自分でproject.clj
を解析することができますが、これは迷惑かもしれません。それはまた多くの仕事です。代わりに、あなただけ行うことができます。
(System/getProperty "projectname.version")
は、uberjarではなくreplから動作します。 –
@ DanRossこれは、現在のプログラムがreplから開始されたかどうかを検出するために使用できますか?または、より簡単で信頼性の高い方法がありますか? –
私は、システムのプロパティを含む多くの供給源からの設定で吸う環境(https://github.com/weavejester/environ)を使用します。このdiscussionで説明したように
foobar.repl=> (require '[environ.core :refer [env]])
nil
foobar.repl=> (:foobar-version env)
"0.1.0-SNAPSHOT"
::<project-name>-version
として、プロジェクトのバージョンが表示されます。
(ns myproject.example
(:require [clojure.java.io :as io])
(:import java.util.Properties))
(defn get-version [dep]
(let [path (str "META-INF/maven/" (or (namespace dep) (name dep))
"/" (name dep) "/pom.properties")
props (io/resource path)]
(when props
(with-open [stream (io/input-stream props)]
(let [props (doto (Properties.) (.load stream))]
(.getProperty props "version"))))))
(get-version 'myproject) ; => 0.1.0
(get-version 'org.clojure/clojure) ; => 1.3.0
あなただけのプロジェクトのバージョンが必要な場合は、それがここで言及されています http://stackoverflow.com/questions/11235445/embed-version-string-from-leiningen-project-in-application – ktsujister