Embed version string from leiningen project in application

不羁的心 提交于 2019-11-29 03:55:15

If you're running inside Leiningen using lein run or the like, it's available as a system property: (System/getProperty "myproject.version"). If you're producing a jar you need to read pom.properties.

I like technomancy's answer, but I had to go look up how to "read pom.properties". It turns out that for the maven artifact com.example/my-project, there is a file on the classpath under

META-INF/maven/com.example/my-project/pom.properties

which you can read into a java.util.Properties and get out a "version" key.

(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")))

Someone has written a nice library for handling this: https://github.com/trptcolin/versioneer

It works for lein projects, both running in lein and from an uberjar. Use it like the following (taken from the Github page):

Add this to your project.clj:

[trptcolin/versioneer "0.2.0"]

Then, in your code, do something like this, where GROUP-ID and ARTIFACT-ID are the usual Leiningen/Maven identifiers for your project.

user=> (require '[trptcolin.versioneer.core :as version])
nil
user=> (version/get-version "GROUP-ID" "ARTIFACT-ID")
"1.2.3-SNAPSHOT"

if you build a jar file you can extract the current version from the jar file.

otherwise if you are not doing AOT then you can read the project.clj file (because it's a map) and then extract the version.

I certainty hope there is a more elegant solution short of writing a leiningen plugin for this (unless someone else wants to write this, hint hint..)

Here is how I read my project name and version, note that the project.clj file is read during compilation and jar file simply contains the string:

(defmacro proj-version []
  (some->> (slurp "project.clj") clojure.edn/read-string (drop 1) (take 2) (str/join " ")))

(defn -main []
  (println (proj-version))

so for (defproject abc "1.2.3" ..., when you run -main it will print:

abc 1.2.3
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!