如何在Cabal项目中配置ghcid的allow-eval功能
问题描述
原本在Stack项目中使用以下命令运行ghcid,可通过-- $> unit_simple_single执行指定函数:
ghcid --command 'stack ghci' --allow-eval --clear --no-height-limit '-o ghcid.log'
切换到Cabal项目后,改用命令:
ghcid --command 'cabal repl' --allow-eval --clear --no-height-limit '-o ghcid.log'
执行函数时出现错误:
<interactive>:28:1-18: error: Variable not in scope: unit_simple_single
已知Stack会自动加载项目模块,而Cabal不会。尝试创建.ghci文件并添加:load SuiteRuntimeTest但仍无效,请问需要在.ghci中配置什么才能让ghcid的eval功能正常工作?是否有类似hpack的工具可以生成该文件?
解决方案
1. 修正.ghci配置
仅加载模块不足以让函数进入全局作用域,需要补充导入语句,两种可选配置:
- 全局导入(适合调试):将模块内容直接导入全局命名空间,在
.ghci中添加::set -isrc # 若模块在src目录下,先添加源码路径(按需调整) :load SuiteRuntimeTest import SuiteRuntimeTest - 限定命名空间(避免冲突):保留模块前缀,在
.ghci中添加:
此时执行函数需改为:set -isrc :load SuiteRuntimeTest import qualified SuiteRuntimeTest as SRT-- $> SRT.unit_simple_single
注意.ghci要放在项目根目录,确保cabal repl启动时能读取到。
2. 直接在ghcid命令中指定模块
无需依赖.ghci,可以直接让cabal repl启动时加载目标模块,修改ghcid命令为:
ghcid --command 'cabal repl SuiteRuntimeTest' --allow-eval --clear --no-height-limit '-o ghcid.log'
这样启动后直接用-- $> unit_simple_single即可执行函数。
3. 自动生成.ghci的替代方案
目前没有类似hpack的通用工具专门生成.ghci,但可以通过以下方式简化配置:
- 在Cabal文件的目标(library/executable)中添加
ghc-options指定默认导入:
这样启动library ... ghc-options: -import SuiteRuntimeTestcabal repl时会自动导入该模块,无需手动维护.ghci - 编写简单Shell脚本,解析Cabal文件中的模块列表,自动生成
.ghci的加载和导入语句。
内容的提问来源于stack exchange,提问作者John Walker
相关产品推荐
相关产品推荐

