2011-09-29 30 views
5

Dự án dựa trên Clojure của tôi sử dụng máy chủ web netty (yêu cầu bởi aleph). Tôi khởi động server, cùng với các thành phần khác, trong một tập tin như thế này:Quy trình làm việc để khởi động lại máy chủ HTTP từ Clojure REPL

(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)) 

Các ví dụ máy chủ được lưu trữ trong một Clojure nguyên tử, vì vậy nó có thể được dừng lại sau.

tôi sử dụng Emacs and Swank trực tiếp khởi động máy chủ trên REPL như thế này (sau khi biên dịch với C-c C-k):

user> (myproject.web/initialize) 

Bất cứ khi nào hoặc khác module phụ thuộc được chỉnh sửa, tôi phải

  1. nhớ KHÔNG biên dịch lại sử dụng Cc Ck vì nguyên tử giữ dụ đang chạy sẽ biến mất (do nguyên tử từ mô-đun mới được biên dịch) từ REPL.

  2. Chạy (myproject.web/reinitialize) để dừng máy chủ và sau đó tải lại mô-đun trước khi bắt đầu lại.

Có hai vấn đề với điều này:

  • Thường thì tôi quên điểm # 1 và nhấn C-c C-k anyway. Điều này gây ra sự mất mát của nguyên tử máy chủ trong REPL, dẫn đến phải giết swank (hoặc khởi động lại emacs) để tôi có thể khởi động máy chủ tại cùng một số cổng.

  • :reload-all không báo cáo lỗi biên dịch thân thiện như C-c C-k (lỗi traceback xấu xí so với lỗi có thể nhấp ngắn gọn).

Làm cách nào để giải quyết tốt nhất hai vấn đề này trong luồng công việc chỉnh sửa biên dịch lại?

Trả lời

6

Bạn có thể thay

(def server (atom nil)) 

với

(defonce server (atom nil)) 

theo cách đó khi bạn đánh giá bộ đệm nó sẽ không xác định lại máy chủ.

2

cho vấn đề đầu tiên của bạn, bạn có thể lưu trữ nguyên tử trong một không gian tên khác và khi tải chỉ ghi đè lên nó nếu nó chưa được xác định. đặt nó trong namepspace riêng của nó sẽ ngăn chặn nó khỏi bị xóa bởi reload-tất cả

Các vấn đề liên quan