2013-04-29 6 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

答えて

15

Leiningenをプロジェクトファイルには、ちょうどClojureのデータです:)

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

+4

この生成されたjarでは動作しません。 – radu122

+1

'(some->(io/resource" project.clj ")slurp edn/read-string(nth 2))' – joelittlejohn

11

project.cljの最後に以下のコードを追加します。

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

今、あなたはVARを持っていますreplの最初の名前空間にはproject-versionと呼ばれています。

8

vemvと言っていますが、LeiningenのプロジェクトファイルはClojureのデータです。だから、それは普通のhash-mapとしてプロジェクトにアクセスするのは簡単です:

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

あなただけのreplで、この変数が必要な場合は、あなたがあなたのproject.cljrepl-optionsに追加することができます:今

(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))}) 

、あなたreplprojectという変数があります。したがって、プロジェクトのバージョンにアクセスするには、(: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

は、uberjarではなくreplから動作します。 –

+0

@ DanRossこれは、現在のプログラムがreplから開始されたかどうかを検出するために使用できますか?または、より簡単で信頼性の高い方法がありますか? –

7

私は、システムのプロパティを含む多くの供給源からの設定で吸う環境(https://github.com/weavejester/environ)を使用します。このdiscussionで説明したように

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

:<project-name>-versionとして、プロジェクトのバージョンが表示されます。

(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 
関連する問題