是否可以在 clojure repl 中获取项目信息?
例如,如果定义了一个项目:
(defproject blahproject "0.1.2" ....)
在项目目录下运行repl时,有没有这样的功能?
> (project-version)
;=> 0.1.2
虽然您可以自己解析project.clj
,但这可能很烦人。这也是很多工作。相反,您可以这样做:
(System/getProperty "projectname.version")
Leiningen 项目文件只是 Clojure 数据 :)
(-> "/path/to/project.clj" slurp read-string (nth 2))
我使用 environ ( 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"
将以下代码添加到 project.clj 的末尾:
(def project (assoc-in project [:repl-options :init]
`(~'def ~'project-version ~(project :version))))
现在,您将project-version
在 repl 的初始命名空间中调用一个 var。
如本讨论所述。
(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
正如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 )。它将使合并了活动配置文件的项目映射可用于您选择的命名空间中的项目代码。
如果您需要从 clojurescript 执行此操作,您可以创建一个宏(从另一个 clj 文件)并从 cljs 代码中调用它:
;;ex: macro.clj
(defmacro get-project-version []
(System/getProperty "penelope.version"))
;;my_logic_code.cljs
(ns my-logic-code
(:require-macros [macros :as m]))
(def project-version (m/get-project-version))