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
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.
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?