2013-04-29 13 views
18

È possibile acquisire le informazioni sul progetto all'interno del clojure repl?Ottenere la versione dell'attuale progetto clojure nel repl

Ad esempio, se ci fosse un progetto definito:

(defproject blahproject "0.1.2" ....) 

Quando si esegue un repl nella directory del progetto, c'è una funzione come questa?

> (project-version) 
;=> 0.1.2 
+0

Se si desidera solo la versione del progetto, è menzionata qui: http://stackoverflow.com/questions/11235445/embed-version-string-from-leiningen-project-in-application – ktsujister

risposta

15

file di progetto Leiningen sono solo dati Clojure :)

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

+4

Questo non funziona con i barattoli generati. – radu122

+1

Basta usare '(some-> (io/resource" project.clj ") slurp edn/read-string (nth 2))' – joelittlejohn

11

Aggiungere il seguente codice alla fine del project.clj:

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

Ora si avrà una var chiamato project-version nello spazio dei nomi iniziale per il repl.

8

Come diceva vemv, i file di progetto di Leiningen sono solo dati Clojure. Quindi, è facile accedere al vostro progetto come un normale hash-map:

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

Se avete bisogno di questa variabile solo nella vostra repl, è possibile aggiungerlo al repl-options al 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))}) 

Ora, avere variabile project nel proprio repl. Quindi, per accedere alla versione del tuo progetto puoi semplicemente digitare (:version project).

Naturalmente, si può semplicemente utilizzare codice nativo Leiningen per analizzare si file di progetto:

(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)))}) 

Ma, se avete bisogno solo la versione del progetto e nulla più, allora è meglio usare Ankur's soluzione.

6

Per un approccio più completo, si consiglia di dare un'occhiata al plugin configleaf per Leiningen (https://github.com/davidsantiago/configleaf). Renderà la mappa del progetto, con i profili attivi uniti, disponibili per il codice del progetto in uno spazio dei nomi di tua scelta.

13

Mentre è possibile analizzare autonomamente lo project.clj, questo potrebbe essere fastidioso. È anche molto lavoro. Invece, basta che si può fare:

(System/getProperty "projectname.version") 
+5

Funziona dal repl, ma non in un uberjar. –

+0

@DanRoss in modo che questo possa essere utilizzato per rilevare se il programma corrente è stato avviato da un repl? O c'è un modo più semplice/affidabile? –

7

Io uso environ (https://github.com/weavejester/environ), che aspira impostazioni da una serie di fonti, tra cui le proprietà del sistema. La versione del progetto si presenta come :<project-name>-version:

foobar.repl=> (require '[environ.core :refer [env]]) 
nil 
foobar.repl=> (:foobar-version env) 
"0.1.0-SNAPSHOT" 
4

Come descritto in questo discussion.

(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 
Problemi correlati