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

zca*_*ate 21 clojure leiningen

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

例如,如果定义了项目:

(defproject blahproject "0.1.2" ....)
Run Code Online (Sandbox Code Playgroud)

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

> (project-version) 
;=> 0.1.2 
Run Code Online (Sandbox Code Playgroud)

Pau*_*ato 16

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

(System/getProperty "projectname.version")
Run Code Online (Sandbox Code Playgroud)

  • 从repl工作,但不是在uberjar. (12认同)

vem*_*emv 13

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

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

  • 这不适用于生成的jar. (8认同)
  • @joelittlejohn从您的类路径中获取任意project.clj的可能性很高。我得到了clj-time / clj-time,甚至还没有明确地进入该库。小心伸入黑暗的盒子中以随机取出物品。 (2认同)

bba*_*ant 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"
Run Code Online (Sandbox Code Playgroud)


Ank*_*kur 9

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

(def project (assoc-in project [:repl-options :init]
                       `(~'def ~'project-version ~(project :version))))
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*lex 7

对于一个功能更全面的方法,你可能想看看为Leiningen(在configleaf插件https://github.com/davidsantiago/configleaf).它将使项目映射(包含活动配置文件)可用于您选择的命名空间中的项目代码.


rad*_*122 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
Run Code Online (Sandbox Code Playgroud)


Leo*_*tny 6

正如vemv所说,Leiningen项目文件只是Clojure数据.因此,以普通方式访问您的项目很容易hash-map:

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

如果您只需要在您的变量中使用此变量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))})
Run Code Online (Sandbox Code Playgroud)

现在,你有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)))})
Run Code Online (Sandbox Code Playgroud)

但是,如果您只需要项目的版本而已,那么最好使用Ankur的解决方案.