Hoplon搭配Castra:boot dev启动时后端无法自动加载的问题求助
解决Boot Dev启动时自动加载后端的问题
问题回顾
我遇到这个问题有一段时间了:当我在build.boot中使用以下任务定义时,执行boot dev后后端不会自动加载,必须手动编辑并保存某个后端文件才会触发加载。
(deftask dev [] (comp (serve :port 8000 :handler 'myapp.handler/app :reload true) (watch) (hoplon) (reload) (cljs)))
补充说明:如果我编辑index.cljs.hl文件,先删除(rpc/init)函数并保存,再重新插入该函数,后端也能正常加载,但这显然不是理想的解决方式。
解决方案
Boot的serve任务里的:reload true参数只是负责监听文件变化并触发重载,并不会在任务启动时主动加载指定的handler命名空间。要让后端在boot dev启动时就加载,我们可以手动添加初始化逻辑:
方法1:用with-pre-wrap在任务执行前加载命名空间
修改你的dev任务,在serve之前添加一个with-pre-wrap步骤,强制加载后端handler的命名空间:
(deftask dev [] (comp (with-pre-wrap fs ;; 强制加载并重载handler命名空间 (eval '(require 'myapp.handler :reload)) fs) (serve :port 8000 :handler 'myapp.handler/app :reload true) (watch) (hoplon) (reload) (cljs)))
with-pre-wrap会在整个任务流开始前执行这段代码,确保myapp.handler命名空间已经被加载,这样serve启动时就能直接找到对应的handler函数了。
方法2:在任务定义时直接加载命名空间
另一种更直接的方式是在定义dev任务时,先手动加载目标命名空间:
(deftask dev [] (do ;; 启动dev任务前先加载handler命名空间 (boot.core/load-namespaces ['myapp.handler]) (comp (serve :port 8000 :handler 'myapp.handler/app :reload true) (watch) (hoplon) (reload) (cljs))))
这种方式会在dev任务被定义的时候就加载命名空间,同样能保证serve启动时后端已经就绪。
这两种方法都能解决你遇到的启动时不加载后端的问题,不需要再通过修改文件来触发了。
内容的提问来源于stack exchange,提问作者phlie
相关产品推荐
相关产品推荐

