Desidero poter interrogare o incorporare la stringa di versione impostata dal progetto leiningen e visualizzare tale valore all'utente. Gli usi includono la visualizzazione della stringa di versione dalla CLI o come intestazione in un'applicazione ad anello. È possibile?Stringa di versione incorporata dal progetto leiningen nell'applicazione
risposta
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
.
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 ..)
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")))
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"
Questo funziona ancora ed è il più semplice scelta di gran lunga. – jwhitlark
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
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