Tôi muốn có thể truy vấn hoặc nhúng chuỗi phiên bản do dự án leiningen thiết lập và hiển thị giá trị đó cho người dùng. Sử dụng bao gồm hiển thị chuỗi phiên bản từ CLI hoặc làm tiêu đề trong ứng dụng vòng. Điều này có thể không?Nhúng chuỗi phiên bản từ dự án leiningen vào ứng dụng
Trả lời
Nếu bạn đang chạy bên trong Leiningen sử dụng lein run
hoặc thích, nó có sẵn dưới dạng thuộc tính hệ thống: (System/getProperty "myproject.version")
. Nếu bạn đang sản xuất một cái lọ bạn cần đọc pom.properties
.
nếu bạn tạo tệp jar, bạn có thể extract the current version from the jar file.
nếu không bạn không thực hiện AOT thì bạn có thể read
tệp project.clj (vì đó là bản đồ) và sau đó trích xuất phiên bản.
Tôi chắc chắn hy vọng có một giải pháp ngắn thanh lịch hơn viết một plugin leiningen cho điều này (trừ khi ai đó muốn viết những dòng này, gợi ý gợi ý ..)
Tôi thích câu trả lời của công nghệ, nhưng tôi phải tìm cách "đọc pom.properties
". Nó chỉ ra rằng cho maven vật com.example/my-dự án, có một tập tin trên classpath dưới
META-INF/maven/com.example/my-project/pom.properties
mà bạn có thể đọc vào một java.util.Properties và nhận ra một "phiên bản" chìa khóa .
(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")))
Có người đã viết một thư viện đẹp để xử lý này: https://github.com/trptcolin/versioneer
Nó hoạt động cho các dự án Lein, cả hai chạy trong Lein và từ một uberjar. Sử dụng nó như sau (lấy từ trang Github):
Thêm phần này vào project.clj của bạn:
[trptcolin/versioneer "0.2.0"]
Sau đó, trong mã của bạn, làm một cái gì đó như thế này, nơi GROUP-ID và ARTIFACT-ID là số nhận dạng Leiningen/Maven thông thường cho dự án của bạn.
user=> (require '[trptcolin.versioneer.core :as version]) nil user=> (version/get-version "GROUP-ID" "ARTIFACT-ID") "1.2.3-SNAPSHOT"
Điều này vẫn hoạt động và dễ dàng nhất lựa chọn cho đến nay. – jwhitlark
Sau đây là cách tôi đọc tên dự án của tôi và phiên bản, lưu ý rằng tập tin project.clj
được đọc trong biên soạn và jar tập tin đơn giản có chứa chuỗi:
(defmacro proj-version []
(some->> (slurp "project.clj") clojure.edn/read-string (drop 1) (take 2) (str/join " ")))
(defn -main []
(println (proj-version))
như vậy cho (defproject abc "1.2.3" ...
, khi bạn chạy -main
nó sẽ in:
abc 1.2.3
Thật không may dường như nó không hoạt động, sau đây trả về nil, w hen được gọi là sử dụng java trên một uberjar từ một lớp AOT: '(println" blargl "(.getSpecificationVersion (.getPackage (class * ns *)))" \ n "))' – MrEvil