Skip to content
shengdoushi edited this page Jan 6, 2019 · 2 revisions

有多种方法可以优化您的开发工作流程:

第一种方法更快速,且易于设置。ring-devel 库中为此提供了中间件。

不过,命名空间重新加载并不会重新加载应用程序的状态。因此,某些情况下,您可能需要重新启动服务器。

使用 lein-ring 插件进行设置

lein-ring 插件是最直接的方式。创建两个文件

  • src/sample.clj
  • project.clj

src/sample.clj 中提供了一个简单的服务: 返回 'Hello World'.

(ns sample)

(defn handler [request]
  {:status 200
   :headers {"Content-Type" "text/plain"}
   :body "Hello world."})

lein-ring 添加到您的 project 文件中, 然后在 src/sample.clj 中配置下 ring handler:

:ring {:handler sample/handler}

一个最小的 project.clj 文件如下:

(defproject lein-demo "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.8.0"]
                 [ring/ring-core "1.6.3"]
                 [ring/ring-jetty-adapter "1.6.3"]
                 [ring/ring-devel "1.6.3"]]
  :ring {:handler sample/handler}
  :plugins [[lein-ring "0.12.1"]])

启动一个开发服务器:

  lein ring server    

访问服务器地址: http://localhost:3000

服务器将自动重新加载源目录中的任何已修改的文件。

设置 boot

Boot是Clojure的一个构建工具,http://boot-clj.com

创建两个文件

  • build.boot
  • src/sample.clj

一个最小的 build.boot 内容如下

(set-env!
  :resource-paths #{"src"}
  :dependencies '[[org.clojure/clojure "1.8.0"]
                  [ring/ring-core "1.6.3"]
                  [ring/ring-jetty-adapter "1.6.3"]
                  [ring/ring-devel "1.6.3"]])

(deftask dev
  "Run server hot reloading Clojure namespaces"
  [p port PORT int "Server port (default 3000)"]
  (require '[sample :as app])
  (apply (resolve 'app/run-dev-server) [(or port 3000)]))

src/sample.clj 中提供了一个简单的服务: 返回 'Hello World'.

(ns sample
  (:require
   [ring.adapter.jetty :refer [run-jetty]]))

(defn handler [request]
  {:status 200
   :headers {"Content-Type" "text/plain"}
   :body "Hello world"})

(defn run-dev-server
  [port]
  (run-jetty handler {:port port}))

检查您的启动任务

boot dev -h

运行服务器

boot dev

访问 http://localhost:3000

接下来,我们可以添加热加载。检查_build.boot_中的依赖项是否包含 ring/ring-devel。将之前的 handler 包装到 wrap-reload handler 中。

(ns sample
  (:require
   [ring.adapter.jetty :refer [run-jetty]]
   [ring.middleware.reload :refer [wrap-reload]]))

(defn handler [request]
  {:status 200
   :headers {"Content-Type" "text/plain"}
   :body "Hello world"})

(def dev-handler
  (wrap-reload #'handler))

(defn run-dev-server
  [port]
  (run-jetty dev-handler {:port port}))

重新启动服务器并访问 http://localhost:3000

现在,服务器将自动重新加载源目录中的任何已修改的文件。