FreeBSD下Yesod项目引入Esqueleto模块加载失败求助
解决Yesod项目中Esqueleto模块加载失败及Cabal配置丢失问题
核心问题分析
- 全局安装的
esqueleto包不在项目的Stack沙箱依赖范围内,导致模块被标记为隐藏。 - 直接修改Cabal文件时,若
yesod devel处于运行状态,实时重载机制可能覆盖手动添加的配置。
分步解决
1. 终止当前yesod devel进程
确保所有相关进程停止,避免配置文件被实时重载覆盖。
2. 正确添加Esquele到项目本地依赖
不要用stack install esqueleto全局安装,而是将其加入项目专属依赖:
- 打开项目根目录下的
your-project-name.cabal文件(替换为实际项目名称)。 - 在
library段的build-depends列表末尾添加:
如果你的Handler代码属于可执行文件部分,需同时在, esqueleto >= 3.5 && < 4executable段的build-depends中添加相同内容。 - 保存文件后执行:
让Stack自动下载并安装项目所需的Esqueleto版本,确保包进入项目沙箱。stack build
3. 精准引入模块并测试
- 仅在需要使用关联查询的Handler文件(如
src/Handlers/Addcontainer.hs)顶部添加模块引入:import Database.Esqueleto.Experimental - 暂时不在
Foundation.hs中引入该模块,先测试单个Handler的编译情况,缩小错误范围。
4. 重启Yesod开发服务器
执行:
stack exec -- yesod devel
此时Stack会使用项目沙箱内的Esqueleto包,不会再出现模块隐藏的提示。
额外注意事项
- 若Cabal配置仍丢失,可尝试用Stack命令自动添加依赖:
该命令会自动修改stack add-dependency esqueletocabal和stack.yaml文件,避免手动编辑出错。 Database.Esqueleto.Experimental是Esqueleto 3.5.x及以上版本才有的模块,stack build会自动匹配兼容版本。
内容的提问来源于stack exchange,提问作者Abner
相关产品推荐
相关产品推荐

