2
所以我有一个简单的web应用程序,它有一个启动http服务器的主要方法。 我想实现的开发设置基本上就像使用lein auto,但我想停止并启动我的服务器并在文件更改时自动重新加载命名空间。 这似乎是应该直接简单的事情,但到目前为止,我还没有找到任何lein插件或其他方法来真正实现这一目标。Clojure重新加载工作流而不使用类似Component的库?
所以我有一个简单的web应用程序,它有一个启动http服务器的主要方法。 我想实现的开发设置基本上就像使用lein auto,但我想停止并启动我的服务器并在文件更改时自动重新加载命名空间。 这似乎是应该直接简单的事情,但到目前为止,我还没有找到任何lein插件或其他方法来真正实现这一目标。Clojure重新加载工作流而不使用类似Component的库?
我认为你正在寻找的是我正在寻找的,tools.namespace和wrap-reload的组合。
这就是我想出了:
(ns your-project.core
(:require [clojure.tools.namespace.repl :as tn]
[org.httpkit.server :as http]
[ring.middleware.reload :refer [wrap-reload]]
[compojure.core :refer [defroutes GET]]
(defroutes create-app []
(GET "/" [] (fn [req] "hello world")
(defonce server (atom nil))
(defn start []
(let [app (create-app)]
(reset! server (http/run-server (wrap-reload app) {:port 3000}))
(println (str "Listening on port " 3000))))
(defn stop []
(when @server
(@server :timeout 100)
(reset! server nil)))
(defn restart []
(stop)
(tn/refresh :after 'your-project.core/start))
是的,这看起来很像是我要找的。谢谢 – user1622727
不应该只在开发模式下重新加载它? – danfromisrael
是的你是对的,我在最近的一个项目中对此进行了扩展,这远非完美,但它试图区分prod和dev https://github.com/swlkr/coast/blob/master/src/海岸/ server.clj – swlkr