[英]Getting the version of the current clojure project in the repl
是否可以在 clojure repl 中獲取項目信息?
例如,如果定義了一個項目:
(defproject blahproject "0.1.2" ....)
在項目目錄下運行repl時,有沒有這樣的功能?
> (project-version)
;=> 0.1.2
雖然您可以自己解析project.clj
,但這可能很煩人。 這也是很多工作。 相反,您可以這樣做:
(System/getProperty "projectname.version")
Leiningen 項目文件只是 Clojure 數據 :)
(-> "/path/to/project.clj" slurp read-string (nth 2))
我使用環境( 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"
將以下代碼添加到 project.clj 的末尾:
(def project (assoc-in project [:repl-options :init]
`(~'def ~'project-version ~(project :version))))
現在,您將在 repl 的初始命名空間中擁有一個名為project-version
的 var。
如本次 討論中所述。
(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
正如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))})
現在,您的repl
有project
變量。 因此,要訪問項目的版本,您只需鍵入(: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 的解決方案。
對於功能更全面的方法,您可能需要查看 Leiningen 的 configleaf 插件 ( https://github.com/davidsantiago/configleaf )。 它將使合並了活動配置文件的項目映射可用於您選擇的命名空間中的項目代碼。
如果您需要從 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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.