2013-04-29 70 views
18

可以在clojure repl中獲取項目信息嗎?在repl中獲取當前clojure項目的版本

例如,如果有一個項目定義:

(defproject blahproject "0.1.2" ....) 

當運行在項目目錄中REPL,有沒有這樣的功能?

> (project-version) 
;=> 0.1.2 
+0

如果你只是想在項目的版本,它就是這裏所說的: http://stackoverflow.com/questions/11235445/embed-version-string-from-leiningen-project-in-application – ktsujister 2013-09-18 06:48:13

回答

15

Leiningen項目文件只是Clojure的數據:)

(-> "/path/to/project.clj" slurp read-string (nth 2))

+4

這不適用於生成的罐子。 – radu122 2015-10-11 22:30:33

+1

只需使用'(some->(io/resource「project.clj」)slurp edn/read-string(nth 2))' – joelittlejohn 2016-09-21 10:46:11

11

下面的代碼添加到project.clj結束:

(def project (assoc-in project [:repl-options :init] 
         `(~'def ~'project-version ~(project :version)))) 

現在你將有一個變種在repl的初始名稱空間中稱爲project-version

8

正如vemv說,Leiningen項目文件只是Clojure的數據。所以,可以很容易地訪問您的項目作爲一個普通的hash-map

(->> "project.clj" 
    slurp 
    read-string 
    (drop 2) 
    (cons :version) 
    (apply hash-map) 
    (def project)) 

如果你需要這個變量只在您的repl,你可以把它添加到repl-optionsproject.clj

(defproject yourproject "0.1.0" 
    :description "" 
    :url "" 
    :dependencies [ [org.clojure/clojure "1.4.0"]] 
    :repl-options { :init (->> "project.clj" 
           slurp 
           read-string 
           (drop 2) 
           (cons :version) 
           (apply hash-map) 
           (def project))}) 

現在,你在您的repl中有project變量。因此,要訪問您的項目版本,只需鍵入(:version project)即可。

當然,你可以簡單地使用本地Leiningen代碼來解析你的項目文件:

(defproject yourproject "0.1.0" 
    :description "" 
    :url "" 
    :dependencies [ [org.clojure/clojure "1.4.0"] 
        [leiningen-core  "2.1.3"]] 
    :repl-options { :init (do (require 'leiningen.core.project) 
          (def project 
           (leiningen.core.project/read)))}) 

但是,如果你只需要你的項目,並沒有更多的版本,那麼最好使用Ankur's解決方案。

6

對於一個功能更全面的方法,你可能想看看爲Leiningen的configleaf插件(https://github.com/davidsantiago/configleaf)。它將使項目地圖與合併的活動配置文件一起用於您選擇的名稱空間中的項目代碼。

13

雖然你可以自己分析project.clj,這可能是惱人。這也是很多工作。相反,你可以這樣做:

(System/getProperty "projectname.version") 
+5

從repl工作,但不在uberjar中工作。 – 2016-06-19 21:40:05

+0

@DanRoss所以這可以用來檢測當前程序是否從repl開始?還是有更簡單/更可靠的方法? – 2018-02-09 08:33:59

7

我採用環保(https://github.com/weavejester/environ),其設置吸入從多個來源,包括系統性能。出現該項目版本:<project-name>-version

foobar.repl=> (require '[environ.core :refer [env]]) 
nil 
foobar.repl=> (:foobar-version env) 
"0.1.0-SNAPSHOT" 
4

在本discussion描述。

(ns myproject.example 
    (:require [clojure.java.io :as io]) 
    (:import java.util.Properties)) 

(defn get-version [dep] 
    (let [path (str "META-INF/maven/" (or (namespace dep) (name dep)) 
        "/" (name dep) "/pom.properties") 
     props (io/resource path)] 
    (when props 
     (with-open [stream (io/input-stream props)] 
     (let [props (doto (Properties.) (.load stream))] 
      (.getProperty props "version")))))) 

(get-version 'myproject) ; => 0.1.0 
(get-version 'org.clojure/clojure) ; => 1.3.0