2016-07-27 28 views
0

ich clojure bin neu, und ich versuche, meinen Kopf um Live-reload in in clojure ich in der Lage sein wollen, wickeln alle/jede Projektdatei zu überwachen/beobachten und den Browser aktualisieren automatischaus clojure Datei Nachladen

Bisher habe ich folgendes

(defproject app2 "0.1.0-SNAPSHOT" 
    :description "FIXME: write this!" 
    :url "http://exampl.com/FIXME" 
    :dependencies [[org.clojure/clojure "1.8.0"] 
       [org.clojure/clojurescript "1.9.89"] 
       [ring "1.5.0"] 
       [stasis "2.2.0"] 
       [hiccup "1.0.5"] 
       [clj-tagsoup "0.3.0"] 
       [optimus "0.18.5"] 
       [ring/ring-jetty-adapter "1.5.0"] 
       [cljs-ajax "0.5.8"] 
       [enfocus "2.1.1"]] 
    :plugins [[lein-cljsbuild "1.1.3"] 
      [lein-ring "0.9.7"]] 
    :cljsbuild {:builds [ 

    {:id "dev" 
    :incremental true 
    :source-paths ["src/cljs"] 
         :compiler { 
          :main "scripts.client" 
          :output-to "resources/public/js/main.js" 
          :output-dir "resources/public/js/out" 
          :asset-path "js/out" 
          }}]} 
    :aliases { 
    "start-dev" ["pdo" ["cljsbuild" "auto"] ["ring" "server-headless"]] 
    } 
    :source-paths ["src"] 
    :resource-paths ["resources"] 
    :main app2.server 
    :repl-options { 
       :prompt (fn [ns] (str "your command for <" ns ">, master? ")) 
       :welcome (println "Welcome to the magical world of the repl!") 
       :init-ns app2.hawk 
       :init (app2.hawk/init) 
       :caught clj-stacktrace.repl/pst+ 
       :skip-default-init false 
       :host "0.0.0.0" 
       :port 9000 
       :timeout 40000 
       } 
    :ring { 
    :init app2.hawk/init 
    :handler app2.server/app 
    :auto-reload? true :auto-refresh? true :reload-paths ["resources/public"] 
    :refresh-paths ["resrouces/public"] 
    } 
    :profiles { 
    :dev { 
      :repl-options { 
      :nrepl-middleware [cemerick.piggieback/wrap-cljs-repl] 
      } 
      :source-paths ["src"] 
      :ring { 
       :nrepl { 
       :start? true 
       :port 9000 
       :host "0.0.0.0" 
       } 
      } 
      :dependencies [ 
       [ring-refresh "0.1.1"] 
       [http-kit "2.0.0"] 
       [org.clojure/tools.nrepl "0.2.11"] 
       [com.cemerick/piggieback "0.2.1"] 
       [hawk "0.2.10"] 
      ] 
      :plugins [ 
       [lein-pdo "0.1.1"] 
      ] 
      } 
     } 

)

für meine Handler ich habe

(ns app2.server 
    (:use [ring.middleware.resource :only [wrap-resource]] 
     [ring.middleware.file-info :only [wrap-file-info]] 
     [ring.middleware.file :only [wrap-file]] 
     [ring.middleware.reload :refer [wrap-reload]] 
     [ring.middleware.content-type :refer [wrap-content-type]] 
     [ring.middleware.refresh :refer [wrap-refresh]] 
     [ring.util.response :refer [file-response]] 
     ) 

(defn wrap-utf-8 
    "This function works around the fact that Ring simply chooses the default JVM 
    encoding for the response encoding. This is not desirable, we always want to 
    send UTF-8." 
    [handler] 
    (fn [request] 
    (when-let [response (handler request)] 
     (if (.contains (get-in response [:headers "Content-Type"]) ";") 
     response 
     (if (string? (:body response)) 
      (update-in response [:headers "Content-Type"] #(str % "; charset=utf-8")) 
      response))))) 


(defn handler [request] 
      (file-response (:uri request) {:root "resources/public"})) 

(def app (-> handler 
      wrap-content-type 
      wrap-reload 
      wrap-refresh [] 
      wrap-utf-8)) 

Und ich bin mit Habicht von repl dann

(ns app2.hawk 
(:require [hawk.core :as hawk]) 
(:require [app2.server :refer [export-pages]])) 

(defn init 
    [] 
    (export-pages) 
    (hawk/watch! [{:paths ["src/app2/templates" "resources/templates"] 
       :filter hawk/modified? 
       :handler (fn [ctx e] 
          (export-pages) ;; i'm compiling html pages dynamically to the server root but how do I then notify browser than html has changed? can i force server to reload from here? 
          ctx)}])) 
+0

Für den normalen Clojure-Arbeitsablauf ist 'lein test-refresh' sehr hilfreich: https://github.com/jakemcc/lein-test-refresh –

+0

Für ClojureScript sollten Sie' figwheel' sehen: https: // github .com/bhauman/lein-figwheel –

+0

Also Feigenrad ist die einzige Lösung? nicht gerade dringend "test". Ich versuche wirklich nur, einige Grundlagen zu erlernen, bevor ich in schwere Rahmenwerke eintrete – Kendall

Antwort

0

Es klingt wie Sie zusammen bisher eine große Setup gesetzt haben. und für die Verwaltung dieses Arbeitsablaufs Figwheel ist der logische nächste Schritt. Wenn Sie irgendwelche Clojurescript + Clojure-Web-Sachen tun, die Sie fast sicher mit figwheel beginnen sollten, werden Sie eine viel angenehmere Erfahrung haben.

+0

Maaannnn Ich habe es zweimal versucht und ich fühle mich nicht wohl damit ... kann die meisten Projektdateien nicht sehen. kann RepL nicht so anpassen, wie ich es möchte. Mir fehlen noch einige Features die meiner Meinung nach Standard sein sollten. Aus dem Hintergrund eines Knotens stammend, hat es nicht gemessen. aber ich werde es noch einmal versuchen. – Kendall

+0

Frage: brauchst du 'lein figwheel' um figwheel zu benutzen? Oder kannst du es benutzen und es in deine existierende Logik" haken "? – Kendall

+0

Es gibt eine API! Sehen Sie sich die Readme an. –

2

Wenn es Ihnen nichts ausmacht, Boot anstelle von Leiningen zu verwenden, wird Ihnen das system Projekt alle Nachlade-Eigenschaften geben, die Sie von einem Lisp erwarten können, mit vielen Beispielen.

Achten Sie darauf, die Holy Grail demo, die Systeme nutzt, um mit minimalem Aufwand loszulegen.

+0

Ich versuchte System 0.3.0-SNAPSHOT zurück, bevor 0.3.0 freigegeben wurde, und es schien ziemlich gut zu funktionieren, um die Boot-Task wie '(System: Auto True)' in meine Task-Pipeline als eine Art von " "Aufgabe aktualisieren". Ich wollte mich jedoch nicht auf eine Schnappschuss-Version verlassen, also habe ich sie für eine Weile beiseite gelegt. Als ich nach der Veröffentlichung von 0.3.0 wieder zurückkam, war es mir nicht mehr möglich, die "System" -Task als einfachen Code-Reloader zu verwenden, weshalb ich das ['boot-refresh'] veröffentlicht habe (https://github.com/samestep/boot-refresh) Bibliothek. Sind die Nachladefähigkeiten des Systems nur für Komponenten gedacht? –

+0

Schön, du hast einen Wrapper für 'tools.namespace' geschrieben! Ja, 'system' wurde entwickelt, um Neustarts zusätzlich zum Neuladen von Code zu ermöglichen, was durch die Nutzung von Component erreicht wird. –

+0

Richtig, das verstehe ich. Was ich mich wundere ist: Es schien mir früher, dass, obwohl 'system' dazu gedacht ist, mit Component verwendet zu werden, es auch als eine Aufgabe funktionieren sollte, einfach Code ohne Component neu zu laden; ist das der Fall, oder funktioniert es einfach nicht, 'system' zu verwenden, um Code ohne Komponente neu zu laden? Wenn Ersteres, könnten Sie möglicherweise etwas Dokumentation mit einer kleinen Demo hinzufügen, die zeigt, wie man das macht?Ich frage, weil ich befürchte, dass ich 'system' nicht einfach richtig verwende und' boot-refresh' tatsächlich keinen Zweck erfüllt, der nicht schon von 'system' erfüllt ist. –