Подтвердить что ты не робот

Получение версии текущего проекта clojure в реплике

Можно ли захватить информацию о проекте в clojure repl?

Например, если был определен проект:

(defproject blahproject "0.1.2" ....)

При запуске repl в каталоге проекта существует ли такая функция?

> (project-version) 
;=> 0.1.2 
4b9b3361

Ответ 1

Файлы проекта Leiningen - это всего лишь Clojure данные:)

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

Ответ 2

Пока вы можете разобрать project.clj самостоятельно, это может раздражать. Это также много работы. Вместо этого вы можете просто сделать:

(System/getProperty "projectname.version")

Ответ 3

Добавьте код ниже в конец project.clj:

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

Теперь у вас будет var, называемый project-version в исходном пространстве имен для repl.

Ответ 4

Как 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.

Ответ 5

Я использую 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"

Ответ 6

Для более полнофункционального подхода вы можете взглянуть на плагин configleaf для Leiningen (https://github.com/davidsantiago/configleaf). Это сделает карту проекта с активными профилями, доступными для кода проекта в пространстве имен по вашему выбору.

Ответ 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