是否可以在clojure repl中获取项目信息?
例如,如果定义了项目:
(defproject blahproject "0.1.2" ....)
在项目目录中运行repl时,是否有这样的函数?
> (project-version)
;=> 0.1.2
答案 0 :(得分:15)
虽然您可以自己解析project.clj
,但这可能很烦人。它还有很多工作要做。相反,你可以这样做:
(System/getProperty "projectname.version")
答案 1 :(得分:13)
Leiningen项目文件只是Clojure数据:)
(-> "/path/to/project.clj" slurp read-string (nth 2))
答案 2 :(得分:10)
我使用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"
答案 3 :(得分:9)
将以下代码添加到project.clj的末尾:
(def project (assoc-in project [:repl-options :init]
`(~'def ~'project-version ~(project :version))))
现在,在repl的初始命名空间中将有一个名为project-version
的var。
答案 4 :(得分:7)
对于功能更全面的方法,您可能需要查看Leiningen(https://github.com/davidsantiago/configleaf)的configleaf插件。它将使项目映射(包含活动的配置文件)可用于您选择的命名空间中的项目代码。
答案 5 :(得分:7)
如本discussion所述。
(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
答案 6 :(得分:6)
正如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's解决方案。
答案 7 :(得分:0)
如果需要从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))