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

  • 在源文件更改时重新加载命名空间
    • 使用 lein-ring 插件进行设置
    • boot 设置
  • 使用一个模块生命周期的管理库 参看交互环境(Interactive Development)
    第一种方法更快速,且易于设置。ring-devel 库中为此提供了中间件。

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

使用 lein-ring 插件进行设置

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

  • src/sample.clj
  • project.clj
    src/sample.clj 中提供了一个简单的服务: 返回 'Hello World'.
  1. (ns sample)
  2.  
  3. (defn handler [request]
  4. {:status 200
  5. :headers {"Content-Type" "text/plain"}
  6. :body "Hello world."})

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

  1. :ring {:handler sample/handler}

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

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

启动一个开发服务器:

  1. lein ring server

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

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

设置 boot

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

创建两个文件

  • build.boot
  • src/sample.clj
    一个最小的 build.boot 内容如下
  1. (set-env!
  2. :resource-paths #{"src"}
  3. :dependencies '[[org.clojure/clojure "1.8.0"]
  4. [ring/ring-core "1.6.3"]
  5. [ring/ring-jetty-adapter "1.6.3"]
  6. [ring/ring-devel "1.6.3"]])
  7.  
  8. (deftask dev
  9. "Run server hot reloading Clojure namespaces"
  10. [p port PORT int "Server port (default 3000)"]
  11. (require '[sample :as app])
  12. (apply (resolve 'app/run-dev-server) [(or port 3000)]))

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

  1. (ns sample
  2. (:require
  3. [ring.adapter.jetty :refer [run-jetty]]))
  4.  
  5. (defn handler [request]
  6. {:status 200
  7. :headers {"Content-Type" "text/plain"}
  8. :body "Hello world"})
  9.  
  10. (defn run-dev-server
  11. [port]
  12. (run-jetty handler {:port port}))

检查您的启动任务

  1. boot dev -h

运行服务器

  1. boot dev

访问 http://localhost:3000

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

  1. (ns sample
  2. (:require
  3. [ring.adapter.jetty :refer [run-jetty]]
  4. [ring.middleware.reload :refer [wrap-reload]]))
  5.  
  6. (defn handler [request]
  7. {:status 200
  8. :headers {"Content-Type" "text/plain"}
  9. :body "Hello world"})
  10.  
  11. (def dev-handler
  12. (wrap-reload #'handler))
  13.  
  14. (defn run-dev-server
  15. [port]
  16. (run-jetty dev-handler {:port port}))

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

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