2013-02-20 9 views
5

Mit Ring/Jetty mit Clojure, wenn ich Änderungen an meinem Code vornehmen, muss ich meine gesamte JVM neu laden.Automatische Code-Neuladung in Ring/Jetty

Gibt es überhaupt eine Möglichkeit, Jetty asynchron mit Änderungen in meinem Code zu halten, damit ich einfach das Browserfenster aktualisieren und Änderungen sofort erhalten kann?

Insbesondere verwende ich Hiccup für HTML-Parsing, und es sind hauptsächlich Änderungen im Layout, die ich mache.

Es wäre eine große Zeitersparnis, wenn Layoutänderungen automatisch kompiliert und im Browser bei der Aktualisierung verfügbar wären.

Hat jemand irgendwelche Informationen dazu? Gibt es Lösungen?

Antwort

8

Sie möchten vielleicht lein-ring speziell :auto-reload? und :auto-refresh? Optionen auschecken.

7

Als eine Alternative zu den Auto-Reload-Funktionen in Ring, wenn Sie ein repl-fähiges Entwicklungssystem wie Emacs + Nrepl oder gegen den Uhrzeigersinn verwenden (wenn Sie dies nicht tun, sollten Sie einen ausprobieren, um den Unterschied zu sehen make) können Sie bestimmte Definitionen oder Dateien direkt aus dem Editor in das laufende System zurückübersetzen. IMO, es ist ein weit überlegener Workflow als Speichern + (automatisches) Nachladen. Ich benutze emacs/nrepl.el und ich hatte nie eine Verwendung zum automatischen Nachladen.

+4

+1 - nur sicher sein, Ihre Handler in einer Art und Weise zu schreiben, die nicht den Wert der fn Sie Hacking auf zwischenspeichert, und Sie können Starten Sie einen eingebetteten Jetty von der REPL und sehen Sie, dass Ihre Änderungen sofort angezeigt werden, wenn Sie eine Neubewertung durchführen, ohne den Server neu zu starten. Fast fühlte sich das erste Mal wie Magie an. :) – Alex

1

Warum nicht lein-ring verwenden?

Hier ist eine Probe project.clj:

(defproject tutorial1 "0.1.0-SNAPSHOT" 
    :description "FIXME: write description" 
    :url "http://example.com/FIXME" 
    :license {:name "Eclipse Public License" 
      :url "http://www.eclipse.org/legal/epl-v10.html"} 
    :repl-options {:port 11111} 
    :plugins [[lein-ring "0.8.8"]] 
    :ring {:handler tutorial1.core/handler 
      :auto-reload? true 
      :auto-refresh? true 
      } 
    :dependencies [[org.clojure/clojure "1.5.1"] 
        [ring/ring-core "1.2.1"] 
        [ring/ring-jetty-adapter "1.2.1"] 
        [ring-refresh "0.1.1"]])