2013-04-30 5 views
5

Ich benutze Monger, um einige Daten in MongoDb von meiner einfachen Clojure App zu holen und zu speichern. Ich habe einen starken Hintergrund von Ruby on Rails, daher bin ich mit den Datenbankeinstellungen pro Umgebung vertraut (Entwicklung, Test, Produktion). Ich möchte etwas ähnliches in Clojure haben. Wie kann ich meinem Code die Umgebung hinzufügen? Ich möchte es in Clojure-Art machen, als Daten kodieren, ohne irgendwelche Yaml-Dateien. Ich benutze Leiningen, wenn sich etwas ändert.Clojure Datenbankeinstellungen pro Umgebung

Antwort

5

Werfen Sie einen Blick auf clj-boilerplate, eine Beispiel-Web-App, die ich erstellt habe.

Es gibt Informationen im README darüber, wie es versteht Umgebungen aus der Box und ein Beispiel Umgebungsdatei kann here zu sehen - aber es sieht etwa so aus:

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

ich da diesen Ansatz weiterentwickelt haben, aber diese sollte dich beginnen.

Hoffe, das hilft.

8

Sie können Leiningen profiles Funktion verwenden.

In Ihrem project.clj definieren Ihre Profile (den meisten Fällen Sie dev und prod müssen)

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

Jetzt 2 Verzeichnisse erstellen resource-dev und resource-prod und config.clj Datei in beide schaffen, die eine Definition haben Karte zum Speichern der Konfiguration. Etwas wie:

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

Dann in Ihrem App-Code können Sie unter Snippet verwenden, um die Konfigurationsdatei zu laden (nur einmal) und die Config-Karte zugreifen:

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

Jetzt können Sie get-config Funktion für den Zugriff verwenden die Konfigurationskarte.

+0

Woher weiß die App, welche Umgebung ausgeführt wird, um die richtigen Einstellungen zu laden? – Lee

+1

Sie führen die App mit einem bestimmten Profil: 'lein with-profile dev run' – Ankur

+0

Und wenn Sie zu einem Ort wie Heroku bereitstellen und Sie können nicht lein with-profile verwenden (ich denke, aber ich habe 5 Tage nach Stunden Clojure unter meinem Gürtel ...). Können Sie auch Standardeinstellungen wie "run" verwenden "dev" und Ihre Tests verwenden "test", sofern nicht anderswo angegeben? – Lee

0

Werfen Sie einen Blick auf Confijulate mit (Stecker für ein persönliches Projekt!):

https://github.com/bbbates/confijulate

Es ermöglicht Ihnen, umgebungsspezifische Konfigurationskarten zu definieren und festlegen, welche man über JVM-Systemeigenschaften zu verwenden.

Verwandte Themen