在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))
(some-> (io/resource "project.clj") slurp edn/read-string (nth 2))
。 - joelittlejohn(some->> (io/resource "META-INF/maven/myproject/myproject/pom.properties") slurp (re-find #"version=(.*)") second)
。 - joelittlejohn我使用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"
如在此讨论中所述。
(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
(def project (assoc-in project [:repl-options :init]
`(~'def ~'project-version ~(project :version))))
project-version
的变量。如vemv所说,Leiningen项目文件只是Clojure数据。因此,很容易将您的项目作为普通的哈希映射
进行访问:
(->> "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)
。(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)。它将使项目映射与活动配置文件合并后,可在您选择的命名空间中向项目代码提供访问。
;;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))