Ich habe ein Clojure-Programm, das ich mit Maven als JAR-Datei erstelle. Das JAR-Manifest enthält eine Build-Versionsnummer, einschließlich des Build-Zeitstempels.
Mit dem folgenden Code kann ich dies zur Laufzeit leicht aus dem JAR-Manifest auslesen:
(defn set-version
"Set the version variable to the build number."
[]
(def version
(-> (str "jar:" (-> my.ns.name (.getProtectionDomain)
(.getCodeSource)
(.getLocation))
"!/META-INF/MANIFEST.MF")
(URL.)
(.openStream)
(Manifest.)
(.. getMainAttributes)
(.getValue "Build-number"))))
aber mir wurde gesagt, dass es schlechtes Karma ist, wenn man def
innerhalb defn
.
Was ist der Clojure-idiomatische Weg, um eine Konstante zur Laufzeit zu setzen? Ich habe offensichtlich keine Informationen über die Build-Version, die ich in meinen Code als def
aber ich möchte, dass es einmal (und für immer) von der main
wenn das Programm startet. Sie sollte dann als eine der folgenden Funktionen verfügbar sein def
für den Rest des laufenden Codes.
UPDATE : Clojure ist übrigens eine der coolsten Sprachen, die mir seit langem untergekommen sind. Großes Lob an Rich Hickey!