Clojureベースの私のプロジェクトでは、Webサーバー(alephに必要)を使用しています。私はこのようなファイルに、他の成分と一緒に、サーバを起動します。それは後に停止させることができるようにClojure REPLからHTTPサーバーを再起動するためのワークフロー
(ns myproject.web)
(def server (atom nil))
(defn initialize []
(if @server
(println "Warning: already initialized")
(let [port 8001]
(println (format "Starting http://localhost:%s/" port))
(swap! server (fn [_] (start-http-server
(wrap-ring-handler app-routes)
{:port port}))))))
(defn shutdown []
(when @server
(do
(println "Shutting down web server")
(@server)
(swap! server (fn [_] nil)))))
(defn reinitialize []
"Run this on the REPL to reload web.clj and restart the web server"
(myproject.web/shutdown)
(use :reload-all 'myproject.web)
(myproject.web/initialize))
サーバーインスタンスは、Clojureの原子に格納されています。
は、私は(C-c C-k
でをコンパイルした後に)直接、このようなREPL上のサーバーを起動するEmacs and Swankを使用します。
user> (myproject.web/initialize)
または他の依存モジュールを編集するたびに、私がしなければならない
実行中のインスタンスを保持するアトムがREPLから(新しくコンパイルされたモジュールのアトムのために)消滅するため、Cc Ckを使用してを再コンパイルしないように注意してください。
サーバを停止する実行
(myproject.web/reinitialize)
、次には、モジュールを再起動する前にリロードします。- は、多くの場合、私はポイント#1を忘れて、とにかく
C-c C-k
を押します。
- は、多くの場合、私はポイント#1を忘れて、とにかく
は、この2つの問題があります。これにより、REPLのサーバーアトムが失われ、同じポート番号でサーバーを起動できるようにスワンク(またはemacsを再起動)を強制終了する必要があります。
:reload-all
コンパイルエラーをC-c C-k
(醜いトレースバックと簡潔なクリック可能なエラー)として報告していません。
この編集 - コンパイル - 再開ワークフローでは、これらの2つの問題にどのようにして対処できますか?