2012-06-27 15 views

Trả lời

8

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.

2

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 ý ..)

+0

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

2

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

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" 
+0

Điều này vẫn hoạt động và dễ dàng nhất lựa chọn cho đến nay. – jwhitlark

0

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 
Các vấn đề liên quan