在repl中获取当前clojure项目的版本

时间:2013-04-29 03:30:15

标签: clojure leiningen

是否可以在clojure repl中获取项目信息?

例如,如果定义了项目:

(defproject blahproject "0.1.2" ....)

在项目目录中运行repl时,是否有这样的函数?

> (project-version) 
;=> 0.1.2 

8 个答案:

答案 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))