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)
vem*_*emv 13
Leiningen项目文件只是Clojure数据:)
(-> "/path/to/project.clj" slurp read-string (nth 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)
将以下代码添加到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 .
对于一个功能更全面的方法,你可能想看看为Leiningen(在configleaf插件https://github.com/davidsantiago/configleaf).它将使项目映射(包含活动配置文件)可用于您选择的命名空间中的项目代码.
如本讨论中所述.
(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)
正如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的解决方案.