2013-04-29 1 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 (https://github.com/davidsantiago/configleaf)의 configleaf 플러그인을 살펴 보시기 바랍니다. 액티브 프로파일이 병합 된 프로젝트 맵을 프로젝트 네임 스페이스의 네임 스페이스에 사용할 수있게합니다.

13

직접 project.clj을 구문 분석 할 수 있지만 이는 성가심 일 수 있습니다. 그것은 또한 많은 일입니다. 대신, 당신은 다만 수

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

을 사용하십시오. repl하지만 uberjar에서는 작동하지 않습니다. –

+0

@DanRoss 이렇게하면 현재 프로그램이 repl에서 시작되었는지 감지하는 데 사용할 수 있습니까? 아니면 더 쉽고 안정적인 방법이 있습니까? –

7

I 시스템 속성을 포함 해 많은 출처에서 설정 빨아와 환경 (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