clojure repl 내의 프로젝트 정보를 가져올 수 있습니까? 가 있다면repl에있는 현재 clojure 프로젝트의 버전 얻기
는 예를 들어, 프로젝트 정의 :
(defproject blahproject "0.1.2" ....)
프로젝트 디렉토리에 REPL을 실행, 이런 기능이?
> (project-version)
;=> 0.1.2
clojure repl 내의 프로젝트 정보를 가져올 수 있습니까? 가 있다면repl에있는 현재 clojure 프로젝트의 버전 얻기
는 예를 들어, 프로젝트 정의 :
(defproject blahproject "0.1.2" ....)
프로젝트 디렉토리에 REPL을 실행, 이런 기능이?
> (project-version)
;=> 0.1.2
Leiningen 프로젝트 파일 만 Clojure의 데이터 :
(-> "/path/to/project.clj" slurp read-string (nth 2))
이 생성 된 jar에서는 작동하지 않습니다. – radu122
'(some-> (io/resource "project.clj") slurp edn/read-string (nth 2))' – joelittlejohn
이 project.clj의 끝 부분에 아래 코드를 추가 있습니다
(def project (assoc-in project [:repl-options :init]
`(~'def ~'project-version ~(project :version))))
지금 당신이 VAR이있을 것이다 repl의 초기 네임 스페이스에 project-version
을 호출했습니다.
vemv과 같이 Leiningen 프로젝트 파일은 Clojure 데이터입니다. 그래서, 그것은 일반 hash-map
으로 프로젝트에 액세스 할 쉽게 :
(->> "project.clj"
slurp
read-string
(drop 2)
(cons :version)
(apply hash-map)
(def project))
당신은 당신의 repl
에서이 변수를해야 할 경우, 당신은 당신의 project.clj
에 repl-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))})
을 지금, 당신은 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 솔루션을 사용하는 것이 가장 좋습니다.
더 많은 기능을 갖춘 방법을 보려면 Leiningen (https://github.com/davidsantiago/configleaf)의 configleaf 플러그인을 살펴 보시기 바랍니다. 액티브 프로파일이 병합 된 프로젝트 맵을 프로젝트 네임 스페이스의 네임 스페이스에 사용할 수있게합니다.
직접 project.clj
을 구문 분석 할 수 있지만 이는 성가심 일 수 있습니다. 그것은 또한 많은 일입니다. 대신, 당신은 다만 수
(System/getProperty "projectname.version")
을 사용하십시오. repl하지만 uberjar에서는 작동하지 않습니다. –
@DanRoss 이렇게하면 현재 프로그램이 repl에서 시작되었는지 감지하는 데 사용할 수 있습니까? 아니면 더 쉽고 안정적인 방법이 있습니까? –
I 시스템 속성을 포함 해 많은 출처에서 설정 빨아와 환경 (https://github.com/weavejester/environ)를 사용합니다. 이 discussion에서 설명한 바와 같이
foobar.repl=> (require '[environ.core :refer [env]])
nil
foobar.repl=> (:foobar-version env)
"0.1.0-SNAPSHOT"
: :<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
, 그것은 여기에 언급되어 http://stackoverflow.com/questions/11235445/embed-version-string-from-leiningen-project-in-application – ktsujister