Clojure 重新加载工作流而不使用像 Component 这样的库?

Clojure reloaded workflow without using library like Component?

所以我有一个简单的 Web 应用程序,它有一个启动 http 服务器的主要方法。 我想要实现的开发设置基本上类似于使用 lein auto,但我想停止并启动我的服务器并在文件更改时自动重新加载名称空间。 这看起来应该是简单明了的事情,但到目前为止我还没有找到任何 lein 插件或其他方法来真正实现这一点。

我想你要找的就是我要找的 tools.namespace and 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))