2016-07-27 53 views
0

我是新來的Clojure和我試圖繞到我的頭住在重裝Clojure中我希望能夠監控/觀看所有/任何項目文件,並自動更新瀏覽器從Clojure的文件重裝

到目前爲止,我有以下

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

爲我處理我有

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

而從REPL

(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

對於常規的clojure工作流程,'lein test-refresh'非常有用:https://github.com/jakemcc/lein-test-refresh –

+0

對於ClojureScript,一定要看'figwheel':https:// github .com/bhauman/lein-figwheel –

+0

所以圖輪是唯一的解決方案?現在不需要任何「測試」。我真的只是想在學習一些重要的框架之前學習一些基礎知識。 – Kendall

回答

0

然後我運行的鷹這聽起來像你迄今已組建了一個偉大的設置。 和管理這個工作流程Figwheel是合乎邏輯的下一步。如果你正在做Clojurescript + clojure-web的東西,你幾乎可以肯定應該從figwheel開始,你會有更愉快的體驗。

+0

Maaannnn我試過兩次無花果葉輪,我對它不太舒服......看不到大部分的項目文件。不能以我想要的方式自定義repl。仍然缺乏一些在我看來應該是標準的功能。來自nodejs背景它沒有測量。但我會再次嘗試。 – Kendall

+0

爲了使用figwheel,你需要'lein figwheel'嗎?或者你可以使用它的api並將它「鉤」到你現有的邏輯中? – Kendall

+0

有一個API!只要看看自述。 –

2

如果您不介意使用Boot而不是Leiningen,那麼system項目將爲您提供Lisp所期望的所有重載優點,並提供大量示例。

一定要檢查利用系統的Holy Grail demo以最小的麻煩開始。

+0

我在0.3.0發佈之前試過系統0.3.0-SNAPSHOT,它似乎很好地將''(system:auto true)''引導任務插入到我的任務管道中,作爲一種「刷新「任務。不過,我不想依賴快照版本,所以我暫時擱置一會兒。當我在0.3.0發佈後回到它的時候,我不再能夠讓'system'任務作爲一個簡單的代碼重載器工作,這就是爲什麼我發佈了['boot-refresh'](https:/ /github.com/samestep/boot-refresh)庫。系統的重新加載功能是否意味着更專業化的組件? –

+0

不錯,你爲'tools.namespace'寫了一個包裝器!是的,除了代碼重新加載,'system'被設計爲提供重新啓動,它通過利用組件來完成。 –

+0

對,我明白了。我想知道的是:在我看來,儘管'system'是爲了與Component一起使用,它也應該作爲一個任務來簡單地重新加載沒有Component的代碼;是這種情況,還是隻是無法使用'系統'重新加載沒有組件的代碼?如果前者,你是否可以添加一些文檔和一個小演示文件來說明如何做到這一點?我在問,因爲我擔心我只是沒有正確使用'system','boot-refresh'實際上並不能滿足任何'system'尚未滿足的目的。 –