24

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

例如,如果定义了一个项目:

(defproject blahproject "0.1.2" ....)

在项目目录下运行repl时,有没有这样的功能?

> (project-version) 
;=> 0.1.2 
4

8 回答 8

18

虽然您可以自己解析project.clj,但这可能很烦人。这也是很多工作。相反,您可以这样做:

(System/getProperty "projectname.version")
于 2014-10-08T04:01:29.990 回答
14

Leiningen 项目文件只是 Clojure 数据 :)

(-> "/path/to/project.clj" slurp read-string (nth 2))

于 2013-04-29T06:20:08.640 回答
11

我使用 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"
于 2015-01-29T21:49:19.913 回答
9

将以下代码添加到 project.clj 的末尾:

(def project (assoc-in project [:repl-options :init]
                       `(~'def ~'project-version ~(project :version))))

现在,您将project-version在 repl 的初始命名空间中调用一个 var。

于 2013-04-29T08:30:48.670 回答
8

如本讨论所述。

(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
于 2015-10-11T22:31:50.937 回答
7

正如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))})

现在,您projectrepl. 因此,要访问项目的版本,您只需键入(: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 的解决方案。

于 2013-04-29T09:15:14.757 回答
7

对于功能更全面的方法,您可能需要查看 Leiningen 的 configleaf 插件 ( https://github.com/davidsantiago/configleaf )。它将使合并了活动配置文件的项目映射可用于您选择的命名空间中的项目代码。

于 2013-04-29T17:04:18.240 回答
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))
于 2020-09-11T14:16:04.143 回答