是否有可能抢在Clojure的REPL内的项目信息?
例如,如果有一个项目定义:
(defproject blahproject "0.1.2" ....)
当在项目目录运行REPL,有没有这样的功能?
> (project-version)
;=> 0.1.2
是否有可能抢在Clojure的REPL内的项目信息?
例如,如果有一个项目定义:
(defproject blahproject "0.1.2" ....)
当在项目目录运行REPL,有没有这样的功能?
> (project-version)
;=> 0.1.2
Leiningen项目文件只是Clojure的数据:)
(-> "/path/to/project.clj" slurp read-string (nth 2))
虽然你可以解析project.clj
自己,这可能是恼人。 这也是大量的工作。 相反,你可以做:
(System/getProperty "projectname.version")
下面的代码添加到project.clj的结尾:
(def project (assoc-in project [:repl-options :init]
`(~'def ~'project-version ~(project :version))))
现在你将有一个变种称为project-version
中的REPL最初的命名空间。
我采用环保( 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"
作为vemv说,Leiningen项目文件只是Clojure的数据。 所以,可以很容易地访问您的项目作为一个普通的hash-map
:
(->> "project.clj"
slurp
read-string
(drop 2)
(cons :version)
(apply hash-map)
(def project))
如果你需要这个变量只在您的repl
,你可以把它添加到repl-options
您project.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))})
现在,你有project
在变量repl
。 因此,要访问项目的版本,你可以简单地输入(: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的解决方案。
对于一个功能更全面的方法,你可能想看看为Leiningen(在configleaf插件https://github.com/davidsantiago/configleaf )。 这将使该项目地图,与活动配置文件中合并,提供您所选择的命名空间的项目代码。
在本描述的讨论 。
(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