Вставить строку версии из проекта leiningen в приложение

Я хочу иметь возможность запрашивать или вставлять строку версии, установленную проектом leiningen, и отображать это значение для пользователя. Использование включает отображение строки версии из CLI или в качестве заголовка в кольцевом приложении. Это возможно?

5 ответов

Решение

Если вы работаете внутри Лайнингена, используя lein run или подобное, оно доступно как системное свойство: (System/getProperty "myproject.version"), Если вы производите банку, вам нужно прочитать pom.properties,

Мне нравится ответ техномантии, но я должен был пойти посмотреть, как "читать pom.propertiesMsgstr "Оказывается, для артефакта 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
Другие вопросы по тегам