You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么cabal repl test会加载src目录模块并触发依赖报错?

根本原因

你遇到的问题是cabal-install 3.4及更早版本的已知缺陷:执行cabal repl <测试套件名称>时,会错误将库模块的源码目录(本案例中是src目录)加入GHCi的源搜索路径,而非直接链接预编译完成的myapp库产物。而你执行默认的cabal repl是直接加载库本身,库的配置中已经声明了relude依赖,所以运行正常。

此时GHCi会尝试直接编译src下的模块,而你的测试套件配置中没有直接声明relude依赖,relude属于myapp库的私有依赖,对测试套件是隐藏状态,因此GHCi编译src/MyApp/X.hs时会报找不到Relude模块的错误。你看到的-Wmissing-home-modules警告也是同一原因导致:cabal误将库的源码模块识别为测试套件的本地模块,而测试套件的other-modules配置中没有列出这些模块。
正常执行cabal test不会触发这个问题,因为测试执行流程会先编译完成库,再用预编译的库产物编译测试代码,不会直接读取src下的源码。

规范解决方式

方案1:升级cabal版本(最优解)

这个缺陷在cabal-install 3.6及之后的版本已经被官方修复,直接升级cabal-install到最新稳定版即可,升级后执行cabal repl tests会正确加载测试目录的代码、链接预编译的myapp库,不会再扫描src目录的源码。

方案2:适配旧版本cabal的配置修改

如果暂时无法升级cabal,可以选择以下两种修改方式:

  • 方式1:在测试套件的build-depends配置中补充relude等所有库用到的依赖,让GHCi直接编译src模块时可以找到对应依赖包。这个方案的缺点是冗余声明了依赖,后续库新增依赖时需要同步更新测试套件的依赖配置。
  • 方式2:执行repl命令时添加参数指定加载逻辑,命令为cabal repl tests --repl-options="-package myapp",强制GHCi直接链接预编译的myapp库,不尝试编译源码目录的模块。

方案3:临时一次性修复

如果不想修改配置,可以在进入报错的GHCi会话后,执行:set -package relude添加缺失的依赖,比你现在用到的多段手动配置更简洁。


内容的提问来源于stack exchange,提问作者Daniil Iaitskov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:54:04