2013-04-30 13 views
5

Sto utilizzando il monger per recuperare e salvare alcuni dati in MongoDb dalla mia semplice app Clojure. Ho un forte background di Ruby on Rails, quindi ho familiarità con le impostazioni del database per ambiente (sviluppo, test, produzione). Voglio avere qualcosa di simile in Clojure. Come posso aggiungere l'ambiente al mio codice? Voglio farlo in Clojure-way, codice come dati, senza file yaml. Sto usando Leiningen se cambia qualcosa.Impostazioni database Clojure per ambiente

risposta

5

Dai un'occhiata allo clj-boilerplate, un'app di esempio web che ho creato.

C'è informazioni nel README su come capisce ambienti fuori dalla scatola e un esempio di file ambiente può essere visto here - ma sembra qualcosa di simile:

(def config 
    (let [env (or (System/getenv "ENVIRONMENT") "development")] 
    ((keyword env) 
     {:development 
     {:database-url "postgres://lborges:@localhost/clj-boilerplate"} 
     :test 
     {:database-url "postgres://lborges:@localhost/clj-boilerplate-test" 
     :production 
     {:database-url (System/getenv "DATABASE_URL")}}))) 

allora ho sviluppato questo approccio, ma questo dovrebbe iniziare.

Spero che questo aiuti.

8

È possibile utilizzare la funzione Leiningen profiles.

Nei tuoi project.clj definire i profili (maggior parte dei casi è necessario dev e prod)

:profiles {:dev {:resource-paths ["resource-dev"]} 
      :prod {:resource-paths ["resource-prod"]}} 

Ora creare 2 directory resource-dev e resource-prod e creare il file config.clj in ciascuno di essi che avrà definire un mappa per memorizzare la configurazione. Qualcosa di simile:

(ns myapp.config) 
(def config {:database "dev"}) 

Poi nel codice dell'app per caricare il file di configurazione è possibile utilizzare sotto frammento (una sola volta) e accedere alla mappa config:

(use 'clojure.java.io) 
(def config (delay (load-file (.getFile (resource "config.clj"))))) 
(defn get-config [] 
    @(force config)) 

Ora è possibile utilizzare get-config funzione per l'accesso la mappa di configurazione.

+0

Come fa l'app a sapere quale ambiente è in esecuzione per caricare le impostazioni corrette? – Lee

+1

Si esegue l'app con un profilo specifico: 'lein with-profile dev run' – Ankur

+0

E quando si distribuisce da qualche parte come Heroku e non si può usare le lein con-profile (penso, ma ho 5 giorni di after hours Clojure sotto la mia cintura ...). Inoltre, puoi impostare i valori di default come run usa "dev" e i tuoi test usano "test" se non specificato altrove? – Lee

0

Dai un'occhiata alla utilizzando Confijulate (presa per un progetto personale!):

https://github.com/bbbates/confijulate

Esso consente di definire mappe di configurazione specifici dell'ambiente, e specificare quale usare tramite le proprietà del sistema JVM.

Problemi correlati