2012-06-27 11 views

risposta

8

Se si sta eseguendo all'interno Leiningen utilizzando lein run o come, è disponibile come una proprietà di sistema: (System/getProperty "myproject.version"). Se stai producendo un barattolo devi leggere pom.properties.

2

se si crea un file jar è possibile extract the current version from the jar file.

altrimenti, se non si esegue AOT, è possibile read il file project.clj (perché è una mappa) e quindi estrarre la versione.

ho certezza spero ci sia un più elegante breve soluzione di scrivere plugin Leiningen per questo (a meno che qualcun altro vuole a scrivere questo, suggerimento suggerimento ..)

+0

Sfortunatamente sembra non funzionare, il seguente ritorna nil, w hen ha chiamato java su un uberjar da una classe AOT: '(println" blargl "(.getSpecificationVersion (.getPackage (class * ns *)))" \ n "))' – MrEvil

2

Mi piace la risposta di tecnomanzia, ma ho dovuto andare a cercare "leggere pom.properties". Si scopre che per il manufatto com.example/my-progetto di Maven, c'è un file sul classpath sotto

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

che si può leggere in un java.util.Properties e ottenere una chiave "versione" .

(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

Qualcuno ha scritto una bella libreria per la manipolazione di questo: https://github.com/trptcolin/versioneer

Si lavora per progetti Lein, sia in esecuzione in Lein e da un uberjar. Usalo come il seguente (preso dalla pagina Github):

Aggiungi questo al vostro project.clj:

[trptcolin/versioneer "0.2.0"] 

Poi, nel codice, fare qualcosa di simile, dove il gruppo-ID e ARTIFACT-ID sono i soliti identificatori Leiningen/Maven per il tuo progetto .

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

Questo funziona ancora ed è il più semplice scelta di gran lunga. – jwhitlark

0

Ecco come ho letto il mio nome del progetto e la versione, si noti che il file project.clj viene letto durante il file di compilazione e jar semplicemente contiene la stringa:

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

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

così per (defproject abc "1.2.3" ..., quando si eseguire -main verrà stampato:

abc 1.2.3 
Problemi correlati