Clojure 在应用程序中嵌入leiningen项目的版本字符串
我希望能够查询或嵌入leiningen项目设置的版本字符串,并向用户显示该值。使用包括显示CLI中的版本字符串,或在环形应用程序中显示为标头。这可能吗?如果您构建一个jar文件,您可以 否则,如果您没有执行AOT,则可以Clojure 在应用程序中嵌入leiningen项目的版本字符串,clojure,leiningen,Clojure,Leiningen,我希望能够查询或嵌入leiningen项目设置的版本字符串,并向用户显示该值。使用包括显示CLI中的版本字符串,或在环形应用程序中显示为标头。这可能吗?如果您构建一个jar文件,您可以 否则,如果您没有执行AOT,则可以读取project.clj文件(因为它是一个映射),然后提取版本 我当然希望有一个更优雅的解决方案,除了为此编写leiningen插件(除非其他人想编写此插件,hint hint…)如果您在leiningen内部使用lein run或类似工具运行,它可以作为系统属性使用:(sys
读取
project.clj文件(因为它是一个映射),然后提取版本
我当然希望有一个更优雅的解决方案,除了为此编写leiningen插件(除非其他人想编写此插件,hint hint…)如果您在leiningen内部使用
lein run
或类似工具运行,它可以作为系统属性使用:(system/getProperty“myproject.version”)
。如果你要制作一个罐子,你需要阅读pom.properties
我喜欢technomancy的答案,但我必须去看看如何“阅读pom.properties
”。事实证明,对于maven工件com.example/my-project,在下面的类路径上有一个文件
META-INF/maven/com.example/my-project/pom.properties
您可以将其读入java.util.Properties并获取“version”键
有人编写了一个很好的库来处理此问题: 它适用于lein项目,既可以在lein中运行,也可以在uberjar中运行。 按如下方式使用它(取自Github页面): 将此添加到您的project.clj:
[trptcolin/versioneer "0.2.0"]
然后,在代码中,执行如下操作,其中GROUP-ID和
ARTIFACT-ID是您的应用程序的常用Leiningen/Maven标识符
项目
user=> (require '[trptcolin.versioneer.core :as version])
nil
user=> (version/get-version "GROUP-ID" "ARTIFACT-ID")
"1.2.3-SNAPSHOT"
下面是我如何读取项目名称和版本的,请注意,
project.clj
文件是在编译期间读取的,jar文件只包含以下字符串:
(defmacro proj-version []
(some->> (slurp "project.clj") clojure.edn/read-string (drop 1) (take 2) (str/join " ")))
(defn -main []
(println (proj-version))
因此,对于(项目abc“1.2.3”…
,当您运行-main
时,它将打印:
abc 1.2.3
不幸的是,它似乎不起作用,当从AOT类在uberjar上使用java调用时,以下返回nil:
(println“blargl”(.getSpecificationVersion(.getPackage(class*ns*))))“\n”)
提示:如果项目中未指定groupid,leiningen会将其设置为与项目名称相同,因此“META-INF/maven/my project/my project/pom.properties”完成了这项工作
abc 1.2.3