У меня есть программа Clojure, которую я создаю как файл JAR с помощью Maven. В манифест JAR встроен номер версии сборки, включая отметку времени сборки.
Я могу легко прочитать это во время выполнения из манифеста JAR, используя следующий код:
(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"))))
но мне сказали, что это плохая карма использовать def
внутри defn
.
Каким идиоматическим способом Clojure является установка константы во время выполнения? Очевидно, что у меня нет информации о версии сборки, которую можно было бы встроить в мой код как def
, но я бы хотел, чтобы она была установлена один раз (и навсегда) из функции main
, когда программа начинается. Затем он должен быть доступен как def
для остальной части работающего кода.
ОБНОВЛЕНИЕ : Кстати, Clojure должен быть одним из самых крутых языков, с которыми я когда-либо сталкивался. Слава Ричу Хики!