2012-06-27 6 views

答えて

8

あなたがlein runまたは使用してLeiningenを内部で実行している場合それはシステムプロパティとして利用可能です:(System/getProperty "myproject.version")。あなたが瓶を生産しているなら、pom.propertiesを読む必要があります。

2

jarファイルを作成する場合は、extract the current version from the jar fileとすることができます。

そうでなければ、AOTを実行していない場合はread project.cljファイル(マップなので)でバージョンを抽出することができます。

私は確信(他の誰かがこの、ヒントヒントを書きたい場合を除き...)このためLeiningenをプラグインを書くのよりエレガントな解決策の短いがあると思います

+0

不幸にも、次のように出力されます。nil、w AOTクラスのuberjarでjavaを使用して呼び出された: '(println" blargl "(.getSpecificationVersion(.getPackage(class * ns *)))" \ n "))' – MrEvil

2

私はtechnomancyの答えが好きですが、私は "pom.propertiesを読む"を調べる必要がありました。これは、Mavenのアーティファクトcom.example /私のプロジェクトのために、あなたはjava.util.Propertiesに読み込まれ、「バージョン」のキーを取得することができます

META-INF/maven/com.example/my-project/pom.properties 

下のクラスパス上のファイルがあることが判明します。

(ns com.example.version 
    (:require [clojure.java.io :as io]) 
    (:import (java.util Properties))) 

(defn read-project-version [groupid artifact] 
    (-> (doto (Properties.) 
     (.load (-> "META-INF/maven/%s/%s/pom.properties" 
       (format groupid artifact) 
       (io/resource) 
       (io/reader)))) 
    (.get "version"))) 
2

誰かがこれを処理するための素敵なライブラリを書いた:https://github.com/trptcolin/versioneer

それは両方がレインにしてuberjarから実行している、レインのプロジェクトのために働きます。 は(Githubのページから取られた)次のようにそれを使用します。

は、あなたのproject.cljにこれを追加します。

[trptcolin/versioneer "0.2.0"] 

次に、あなたのコードでは、GROUP-IDこのような何かを、行います ARTIFACT-IDは、 プロジェクトの通常のLeiningen/Maven識別子です。ここで

user=> (require '[trptcolin.versioneer.core :as version]) 
nil 
user=> (version/get-version "GROUP-ID" "ARTIFACT-ID") 
"1.2.3-SNAPSHOT" 
+0

これはまだ動作し、最も簡単ですこれまでの選択。 – jwhitlark

0

project.cljファイルは、コンパイルとjarファイル中に読み込まれることに注意することは、単純に文字列が含まれている、私は私のプロジェクト名とバージョンを読み込む方法です:

(defmacro proj-version [] 
    (some->> (slurp "project.clj") clojure.edn/read-string (drop 1) (take 2) (str/join " "))) 

(defn -main [] 
    (println (proj-version)) 

そう(defproject abc "1.2.3" ...ために、とき

関連する問題