Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 在应用程序中嵌入leiningen项目的版本字符串_Clojure_Leiningen - Fatal编程技术网

Clojure 在应用程序中嵌入leiningen项目的版本字符串

Clojure 在应用程序中嵌入leiningen项目的版本字符串,clojure,leiningen,Clojure,Leiningen,我希望能够查询或嵌入leiningen项目设置的版本字符串,并向用户显示该值。使用包括显示CLI中的版本字符串,或在环形应用程序中显示为标头。这可能吗?如果您构建一个jar文件,您可以 否则,如果您没有执行AOT,则可以读取project.clj文件(因为它是一个映射),然后提取版本 我当然希望有一个更优雅的解决方案,除了为此编写leiningen插件(除非其他人想编写此插件,hint hint…)如果您在leiningen内部使用lein run或类似工具运行,它可以作为系统属性使用:(sys

我希望能够查询或嵌入leiningen项目设置的版本字符串,并向用户显示该值。使用包括显示CLI中的版本字符串,或在环形应用程序中显示为标头。这可能吗?

如果您构建一个jar文件,您可以

否则,如果您没有执行AOT,则可以
读取
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