2012-06-27 15 views

回答

8

如果你在裏面Leiningen使用lein run或運行的更優雅的解決方案短例如,它可以作爲系統屬性提供:(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。示例/我的項目,還有正在

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

類路徑上的一個文件,你可以讀入一個java.util.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"] 

然後,在你的代碼,做這樣的事情,在組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" ...,當你運行-main它會打印:

abc 1.2.3 
相關問題