2012-06-27 14 views

Respuesta

8

Si está ejecutando dentro de Leiningen usando lein run o la como, está disponible como una propiedad del sistema: (System/getProperty "myproject.version"). Si está produciendo un frasco, debe leer pom.properties.

2

si construye un archivo jar puede extract the current version from the jar file.

de lo contrario, si no está haciendo AOT, entonces puede read el archivo project.clj (porque es un mapa) y luego extraer la versión.

I certeza espero que haya una solución más elegante corto de escribir un plugin para este Leiningen (a menos que alguien quiere escribir esto, pista pista ..)

+0

Desafortunadamente parece que no funciona, lo siguiente devuelve nil, w la llamaron usando java en un uberjar de una clase AOT: '(println" blargl "(.getSpecificationVersion (.getPackage (class * ns *)))" \ n "))' – MrEvil

2

Me gusta la respuesta de technomancy, pero tuve que buscar cómo "leer pom.properties". Resulta que para el artefacto com.example/mi-proyecto Maven, hay un archivo en la ruta de clases bajo

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

que se puede leer en un java.util.Properties y obtener una llave "versión" .

(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

Alguien ha escrito una buena biblioteca para manejar esto: https://github.com/trptcolin/versioneer

funciona para proyectos Lein, ambos corriendo en Lein y desde un uberjar. Se usa como la siguiente (tomado de la página de Github):

Agregue esto a su project.clj:

[trptcolin/versioneer "0.2.0"] 

Luego, en el código, hacer algo como esto, donde GRUPO-ID y ARTIFACT-ID son los identificadores habituales de Leiningen/Maven para su proyecto .

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

Esto sigue funcionando, y es el más fácil elección por ahora. – jwhitlark

0

Aquí es cómo leo mi nombre del proyecto y la versión, tenga en cuenta que el archivo project.clj se lee durante archivo de compilación y tarro simplemente contiene la cadena:

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

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

así que para (defproject abc "1.2.3" ..., cuando ejecutar -main se imprimirá:

abc 1.2.3 
Cuestiones relacionadas