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

时间:2012-06-27 22:04:30

标签: clojure leiningen

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

5 个答案:

答案 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