2011-09-29 20 views
5

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) 

または他の依存モジュールを編集するたびに、私がしなければならない

  1. 実行中のインスタンスを保持するアトムがREPLから(新しくコンパイルされたモジュールのアトムのために)消滅するため、Cc Ckを使用してを再コンパイルしないように注意してください。

  2. サーバを停止する実行(myproject.web/reinitialize)、次には、モジュールを再起動する前にリロードします。

    • は、多くの場合、私はポイント#1を忘れて、とにかくC-c C-kを押します。

は、この2つの問題があります。これにより、REPLのサーバーアトムが失われ、同じポート番号でサーバーを起動できるようにスワンク(またはemacsを再起動)を強制終了する必要があります。

  • :reload-allコンパイルエラーをC-c C-k(醜いトレースバックと簡潔なクリック可能なエラー)として報告していません。

  • この編集 - コンパイル - 再開ワークフローでは、これらの2つの問題にどのようにして対処できますか?

    答えて

    6

    によって消去されることを防ぐことができますサーバ。

    2

    最初の問題では、別の名前空間にアトムを格納することができます。ロード時には、まだ定義されていない場合にのみ上書きします。それ自身のnamepspaceでそれを置くことはあなたがバッファを評価するとき、それは再定義しません、そのよう

    (defonce server (atom nil)) 
    

    (def server (atom nil)) 
    

    を置き換えることができリロード-すべて

    関連する問題