从clojure文件重新加载

时间:2016-07-27 20:35:43

标签: clojure read-eval-print-loop ring

我是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

运行hawk
(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)}]))

2 个答案:

答案 0 :(得分:2)

如果您不介意使用Boot而不是Leiningen,那么system项目将为您提供Lisp的所有重新加载优势,并提供大量示例。

请务必检查利用系统的Holy Grail demo,以便轻松入门。

答案 1 :(得分:0)

听起来你到目前为止已经完成了一个很棒的设置。 并且为了管理这个工作流Figwheel是合乎逻辑的下一步。如果你正在做任何Clojurescript + clojure-web的东西,你几乎肯定应该从figwheel开始,你将获得更愉快的体验。