2012-06-27 7 views
9

मैं लीनिंगेन प्रोजेक्ट द्वारा सेट की गई संस्करण स्ट्रिंग को क्वेरी या एम्बेड करने में सक्षम होना चाहता हूं और उस मान को उपयोगकर्ता को प्रदर्शित करता हूं। उपयोग में सीएलआई से संस्करण स्ट्रिंग प्रदर्शित करना, या एक अंगूठी अनुप्रयोग में शीर्षलेख के रूप में शामिल करना शामिल है। क्या यह संभव है?एप्लिकेशन में लीनिंगेन प्रोजेक्ट से एम्बेड संस्करण स्ट्रिंग

उत्तर

8

(जब तक किसी और यह लिखने के लिए, संकेत संकेत .. चाहता है) आप lein run या का उपयोग कर Leiningen अंदर चला रहे हैं का एक और अधिक सुरुचिपूर्ण समाधान कम होती है जैसे, यह सिस्टम प्रॉपर्टी के रूप में उपलब्ध है: (System/getProperty "myproject.version")। यदि आप एक जार का उत्पादन कर रहे हैं तो आपको pom.properties पढ़ने की आवश्यकता है।

2

यदि आप एक जार फ़ाइल बनाते हैं तो आप extract the current version from the jar file कर सकते हैं।

अन्यथा यदि आप एओटी नहीं कर रहे हैं तो आप Project.clj फ़ाइल read कर सकते हैं (क्योंकि यह एक मानचित्र है) और फिर संस्करण निकालें।

मैं यक़ीन उम्मीद है कि इस के लिए एक leiningen प्लगइन लेखन

+0

दुर्भाग्यवश यह काम नहीं करता प्रतीत होता है, निम्नलिखित रिटर्न शून्य, डब्ल्यू मुर्गी ने एओटी कक्षा से uberjar पर जावा का उपयोग करने के लिए कहा: '(println" blargl "(.getSpecificationVersion (.getPackage (class * ns *)))" \ n "))' – MrEvil

2

मुझे टेक्नोमेंसी का जवाब पसंद है, लेकिन मुझे यह देखना होगा कि "pom.properties पढ़ें"। यह पता चला Maven विरूपण साक्ष्य com.example/मेरी-परियोजना के लिए, वहाँ जो आपको एक java.util.Properties में पढ़ सकते हैं और एक "संस्करण" कुंजी बाहर निकल सकते हैं

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

तहत classpath पर एक फ़ाइल है कि ।

(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

का कोई व्यक्ति इस से निपटने के लिए एक अच्छा पुस्तकालय लिखा है: https://github.com/trptcolin/versioneer

यह lein परियोजनाओं के लिए काम करता है, दोनों lein में और एक uberjar से चल रहा है। (Github पेज से लिया गया) निम्नलिखित की तरह यह प्रयोग करें:

यह आपके project.clj में जोड़ें: अपने कोड में, फिर

[trptcolin/versioneer "0.2.0"] 

, कुछ इस तरह है, जहां ग्रुप-आईडी करना और आर्टिफैक्ट-आईडी आपके प्रोजेक्ट के लिए सामान्य लीनिंगेन/मेवेन पहचानकर्ता हैं।

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

यह अभी भी काम करता है, और सबसे आसान है दूर तक पसंद है। – jwhitlark

0

यहाँ है कैसे मैं अपने प्रोजेक्ट नाम और संस्करण पढ़ा है, ध्यान दें कि project.clj फ़ाइल संकलन और जार फ़ाइल के दौरान पढ़ने के लिए है बस स्ट्रिंग है:, जब आप

(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 
संबंधित मुद्दे