为何使用stack ghci无法导入System.Directory模块,但runhaskell可正常运行?
为什么
runhaskell能导入System.Directory但stack ghci不行? 这个问题其实挺常见的,核心原因就在于**runhaskell和stack ghci用的是完全两套独立的GHC环境**,我来给你拆解清楚:
两者的环境差异
runhaskell的逻辑:它直接调用你系统里全局安装的GHC。大部分系统级的GHC默认都会预装directory包(毕竟很多基础工具都依赖它),所以你跑代码的时候能顺利找到System.Directory模块。stack ghci的逻辑:Stack是个隔离式的构建工具,它会用自己管理的GHC版本和依赖集合——要么是官方的快照,要么是你项目本地定义的依赖。如果你的项目没在配置文件里明确声明要依赖directory包,Stack就不会把它加入到ghci的搜索路径里,自然就报找不到模块的错了。
解决方法
永久解决(推荐)
修改你的项目依赖配置文件,把directory加进去:
- 如果用的是
.cabal文件,找到你的可执行目标(比如executable Hello),在build-depends里添加directory(可以加上版本范围,比如directory >= 1.3 && < 2):executable Hello main-is: Main.hs build-depends: base >= 4.14 && < 5, directory >= 1.3 && < 2 -- 其他配置项保持不变 - 如果用的是
package.yaml,在对应可执行文件的dependencies列表里加上:executables: Hello: main: Main.hs dependencies: - base >= 4.14 && <5 - directory >= 1.3 && <2
改完之后重启stack ghci,Stack会自动处理依赖下载和加载,这时候就能正常导入模块了。
临时测试方案
如果只是想临时测试不想改配置,可以在启动ghci的时候加上--package参数:
stack ghci --package directory
这样会临时把directory包加入到ghci的环境里,但这只是权宜之计,长期还是建议把依赖写到配置文件里,避免后续出现同样的问题。
内容的提问来源于stack exchange,提问作者SAN
相关产品推荐
相关产品推荐

