我希望能够查询或嵌入leiningen项目设置的版本字符串,并将该值显示给用户。用途包括从CLI显示版本字符串,或作为环形应用程序中的标题显示。这可能吗?
答案 0 :(得分:8)
如果您使用lein run
等在Leiningen内部运行,它可以作为系统属性使用:(System/getProperty "myproject.version")
。如果你正在制作一个罐子,你需要阅读pom.properties
。
答案 1 :(得分:3)
我喜欢技术性的答案,但我必须去查看如何阅读pom.properties
"。事实证明,对于maven artifact com.example / my-project,在
META-INF/maven/com.example/my-project/pom.properties
你可以读入java.util.Properties并获得一个"版本"键。
(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")))
答案 2 :(得分:2)
有人编写了一个很好的库来处理这个问题:https://github.com/trptcolin/versioneer
适用于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"
答案 3 :(得分:1)
如果你构建一个jar文件,你可以extract the current version from the jar file。
否则,如果您没有进行AOT,那么您可以read
project.clj文件(因为它是一张地图),然后提取版本。
我确信希望有一个更优雅的解决方案,而不是为此写一个leiningen插件(除非别人想写这个,提示暗示......)
答案 4 :(得分:0)
以下是我阅读项目名称和版本的方法,请注意编译时会读取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))
因此对于(defproject abc "1.2.3" ...
,当您运行-main
时,它将打印:
abc 1.2.3