【发布时间】:2012-06-29 10:19:37
【问题描述】:
我希望能够查询或嵌入由 leiningen 项目设置的版本字符串并将该值显示给用户。用途包括显示来自 CLI 的版本字符串,或作为环应用程序中的标题。这可能吗?
【问题讨论】:
我希望能够查询或嵌入由 leiningen 项目设置的版本字符串并将该值显示给用户。用途包括显示来自 CLI 的版本字符串,或作为环应用程序中的标题。这可能吗?
【问题讨论】:
如果您在 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 并获取“版本”密钥。
(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")))
【讨论】:
有人编写了一个很好的库来处理这个问题: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"
【讨论】:
如果你构建一个 jar 文件,你可以extract the current version from the jar file。
否则,如果您不进行 AOT,那么您可以 read project.clj 文件(因为它是一个地图)然后提取版本。
我当然希望有一个更优雅的解决方案,而不是为此编写一个 leiningen 插件(除非其他人想写这个,提示提示..)
【讨论】:
(println "blargl" (.getSpecificationVersion (.getPackage (class *ns*))) "\n"))
这是我读取项目名称和版本的方式,注意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
【讨论】: