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

如何在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 SuiteRuntimeTest
    
    这样启动cabal repl时会自动导入该模块,无需手动维护.ghci
  • 编写简单Shell脚本,解析Cabal文件中的模块列表,自动生成.ghci的加载和导入语句。

内容的提问来源于stack exchange,提问作者John Walker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 14:53:03