如何在多个文件/包中定义Caveman2路由?求正确实现方案
Caveman2 多文件定义路由的正确实现方式
错误原因
你遇到的(SETF NINGLE/APP:ROUTE)无可用方法的问题,本质是新包中没有将路由注册到正确的Caveman2 app实例上——defroute默认依赖当前包的*app*变量,新包未关联:mywebapp.web的*app*时,会导致方法匹配失败。
正确实现步骤
1. 创建独立控制器包
新建src/controllers/hello.lisp,定义独立包并导入必要符号:
(defpackage :mywebapp.controllers.hello (:use :cl) (:import-from :mywebapp.web :*app* :defroute) (:import-from :syntax :use-syntax)) (in-package :mywebapp.controllers.hello) (syntax:use-syntax :annot) ;; 明确指定app实例注册路由 (defroute (*app* "/hello") () (format nil "Hello World!"))
2. 确保控制器包被加载
有两种方式加载控制器文件:
- 直接在web.lisp中加载:
在:mywebapp.web包的代码中添加加载语句:(in-package :mywebapp.web) ;; 加载控制器文件,路径根据实际项目结构调整 (load (merge-pathnames "controllers/hello.lisp" *load-pathname*)) - 通过ASDF系统管理:
修改项目的.asd文件,将控制器文件加入系统组件,确保依赖顺序正确:(defsystem :mywebapp :depends-on (:caveman2 :annot) :components ((:file "web") (:file "controllers/hello" :depends-on ("web"))))
简化写法(可选)
如果希望减少导入代码,可以让控制器包直接使用:mywebapp.web的符号:
(defpackage :mywebapp.controllers.hello (:use :cl :mywebapp.web) (:import-from :syntax :use-syntax)) (in-package :mywebapp.controllers.hello) (syntax:use-syntax :annot) ;; 无需指定*app*,默认使用继承的app实例 (defroute "/hello" () (format nil "Hello World!"))
内容的提问来源于stack exchange,提问作者leinad
相关产品推荐
相关产品推荐

