如何不修改Haskell源文件 抑制GHC的Could not find module导入编译错误
解决方案
GHC目前没有和-fdefer-type-errors完全对应的编译参数来直接延迟Could not find module错误,因为模块查找属于编译前端的早期阶段,执行时机远早于类型检查流程,因此只能通过以下无需修改原有源码的方案实现编译:
- 方案1:使用空占位模块
- 新建一个独立的目录(例如命名为
dummy-modules),不要和原有源码目录混用 - 为每个编译报错缺失的模块,在该目录下创建对应层级的空模块文件:例如缺失
Data.Aeson就创建dummy-modules/Data/Aeson.hs,文件内容仅需写module Data.Aeson where即可 - 编译原有代码时,给GHC加上
-Idummy-modules参数,将占位模块目录加入源码搜索路径
这种方案下,由于你实际没有使用缺失模块的任何内容,编译完成后运行不会触发任何异常。如果存在个别用到缺失模块内容的场景,可以额外加上-fdefer-out-of-scope-variables参数,将未定义符号的报错延迟到运行时抛出。
- 新建一个独立的目录(例如命名为
- 方案2:注册虚拟占位包
如果缺失的模块属于完整的未安装库,可以通过注册空虚拟包的方式处理:- 新建一个极简cabal库项目,库名和你缺失的第三方库名完全一致,版本号随意填写
- 在cabal文件的
exposed-modules字段里列出所有你缺失的该库下的模块 - 每个对应模块都写为空实现,和方案1的模块内容一致
- 用
cabal install --lib把这个空库注册到本地GHC包数据库,后续编译原有代码时会自动找到这个空库的模块
内容的提问来源于stack exchange,提问作者Lorenzo
相关产品推荐
相关产品推荐

