Вставить строку версии из проекта leiningen в приложение
Я хочу иметь возможность запрашивать или вставлять строку версии, установленную проектом leiningen, и отображать это значение для пользователя. Использование включает отображение строки версии из CLI или в качестве заголовка в кольцевом приложении. Это возможно?
5 ответов
Если вы работаете внутри Лайнингена, используя lein run
или подобное, оно доступно как системное свойство: (System/getProperty "myproject.version")
, Если вы производите банку, вам нужно прочитать pom.properties
,
Мне нравится ответ техномантии, но я должен был пойти посмотреть, как "читать pom.properties
Msgstr "Оказывается, для артефакта 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-файл, вы можете извлечь текущую версию из JAR-файла.
в противном случае, если вы не делаете AOT, то вы можете read
файл project.clj (потому что это карта), а затем распакуйте версию.
Я уверен, что есть более элегантное решение, за исключением написания плагина leiningen для этого (если кто-то еще не хочет написать это, намек на подсказку..)
Вот как я читаю название и версию моего проекта, обратите внимание, что 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