Можно ли захватить информацию о проекте в clojure repl?
Например, если был определен проект:
(defproject blahproject "0.1.2" ....)
При запуске repl в каталоге проекта существует ли такая функция?
> (project-version)
;=> 0.1.2
Можно ли захватить информацию о проекте в clojure repl?
Например, если был определен проект:
(defproject blahproject "0.1.2" ....)
При запуске repl в каталоге проекта существует ли такая функция?
> (project-version)
;=> 0.1.2
Файлы проекта Leiningen - это всего лишь Clojure данные:)
(-> "/path/to/project.clj" slurp read-string (nth 2))
Пока вы можете разобрать project.clj
самостоятельно, это может раздражать. Это также много работы. Вместо этого вы можете просто сделать:
(System/getProperty "projectname.version")
Добавьте код ниже в конец project.clj:
(def project (assoc-in project [:repl-options :init]
`(~'def ~'project-version ~(project :version))))
Теперь у вас будет var, называемый project-version
в исходном пространстве имен для repl.
Как 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))})
Теперь у вас есть 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.
Я использую environment (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"
Для более полнофункционального подхода вы можете взглянуть на плагин configleaf для Leiningen (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