【问题标题】:Embed version string from leiningen project in application在应用程序中嵌入来自 leiningen 项目的版本字符串
【发布时间】:2012-06-29 10:19:37
【问题描述】:

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

【问题讨论】:

    标签: clojure leiningen


    【解决方案1】:

    如果您在 Leiningen 中使用 lein run 等运行,它可以作为系统属性使用:(System/getProperty "myproject.version")。如果你正在制作一个罐子,你需要阅读pom.properties

    【讨论】:

      【解决方案2】:

      我喜欢 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")))
      

      【讨论】:

      • 提示:如果您的项目中没有指定 groupid,leiningen 会将其设置为与项目名称相同,因此 "META-INF/maven/my-project/my-project/pom.properties" 可以工作
      【解决方案3】:

      有人编写了一个很好的库来处理这个问题: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"
      

      【讨论】:

        【解决方案4】:

        如果你构建一个 jar 文件,你可以extract the current version from the jar file

        否则,如果您不进行 AOT,那么您可以 read project.clj 文件(因为它是一个地图)然后提取版本。

        我当然希望有一个更优雅的解决方案,而不是为此编写一个 leiningen 插件(除非其他人想写这个,提示提示..)

        【讨论】:

        • 不幸的是,它似乎不起作用,以下返回 nil,当在 AOT 类的 uberjar 上使用 java 调用时:(println "blargl" (.getSpecificationVersion (.getPackage (class *ns*))) "\n"))
        【解决方案5】:

        这是我读取项目名称和版本的方式,注意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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-01
          • 2023-03-12
          • 2018-05-13
          • 2016-01-03
          • 1970-01-01
          • 2012-03-29
          • 1970-01-01
          • 2015-02-24
          相关资源
          最近更新 更多