请考虑以下情形:
最小启动任务启动http服务器:
(boot (serve :handler 'myapp.server/handler
:port 3000))
(这可能会以多种方式启动,只需从nrepl会话运行它,例如从终端boot repl
启动)
处理程序由名称空间handler
内的函数myapp.server
表示。相应的文件如下所示:
(ns myapp.server (:require ...))
(defonce server-state (atom {:nr 0}))
(defn handler [req]
(prn (swap! server-state update :nr inc))
{:body "Answer.\n"})
这样做,每次访问地址localhost:3000时,原子都会更新,新版本将打印到repl内的stdout。
如何在任何时候检查原子?
boot.user=> @myapp.server/server-state
产生错误。 (...no such var...)
当在emacs cider nrepl连接中尝试相同的事情时,此前一次尝试始终显示原子的初始值:{:n 0}
更新
以下是使用emacs / cider时的确切步骤:
cd
projectdir emacs
cider-jack-in
(boot (dev))
Ctrl+C+C
(为了再次获得提示。)curl
进行测试:获取响应+内部emacs更新原子被记录:{:n 1}
.. {:n 2}
.. (require 'myapp.server)
中,需要一段时间:nil
。@myapp.server/state
- >但是:{:n 0}
答案 0 :(得分:0)
您的(...no such var...)
错误可能会发生,因为您还不需要myapp.server
命名空间。尝试在CIDER REPL中查看原子发生的更新失败可能是因为您的响铃应用程序在另一个JVM进程中运行而不是REPL,因此REPL只看到初始值,因为来自环处理程序的更新发生在另一个JVM中,或者它被包含在一个单独的类加载器中它可能被boot POD隔离。
您有两种选择:
在启用REPL服务器的情况下启动您的铃声应用,并从另一个进程(for example by using Server Socket REPL and connecting to it using telnet)
启动您的REPL,然后从中启动您的响铃应用程序,您就可以访问所有已加载的命名空间。
使用第一种方法,您可能需要使用boot-clj的nrepl
选项。当您将其配置为启动nREPL服务器时,您可以使用boot repl -c
(可选地提供与boot-http nrepl选项相同的坐标)或directly from CIDER使用cider-connect
连接到它。