获取当前的Clojure项目的版本在REPL(Getting the version of the

2019-09-01 08:25发布

是否有可能抢在Clojure的REPL内的项目信息?

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

(defproject blahproject "0.1.2" ....)

当在项目目录运行REPL,有没有这样的功能?

> (project-version) 
;=> 0.1.2 

Answer 1:

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

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



Answer 2:

虽然你可以解析project.clj自己,这可能是恼人。 这也是大量的工作。 相反,你可以做:

(System/getProperty "projectname.version")


Answer 3:

下面的代码添加到project.clj的结尾:

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

现在你将有一个变种称为project-version中的REPL最初的命名空间。



Answer 4:

我采用环保( 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"


Answer 5:

作为vemv说,Leiningen项目文件只是Clojure的数据。 所以,可以很容易地访问您的项目作为一个普通的hash-map

(->> "project.clj"
     slurp
     read-string
     (drop 2)
     (cons :version)
     (apply hash-map)
     (def project))

如果你需要这个变量只在您的repl ,你可以把它添加到repl-optionsproject.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的解决方案。



Answer 6:

对于一个功能更全面的方法,你可能想看看为Leiningen(在configleaf插件https://github.com/davidsantiago/configleaf )。 这将使该项目地图,与活动配置文件中合并,提供您所选择的命名空间的项目代码。



Answer 7:

在本描述的讨论 。

(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


文章来源: Getting the version of the current clojure project in the repl