Windows 10下GHC 8.6.5中Text.Regex.Posix/TDFA无法在GHCi加载
这是个很常见的问题,核心原因是Cabal v2+(包括你用的new-install、v2-install)的包管理机制和GHC默认的package查找逻辑不匹配,我来给你拆解清楚:
问题根源
Cabal从v2版本开始引入了隔离式包管理:
- 当你执行
cabal new-install或v2-install时,包会被安装到Cabal的**全局包存储(global package store)**里,这个存储是独立于GHC默认的系统package database的。 - GHCi默认只会从自己的系统package database和当前项目的本地package database(如果有的话)查找包,根本不知道Cabal的全局存储在哪里,所以加载不了你安装的
Text.Regex.Posix和Text.Regex.TDFA。 - 至于
cabal info显示未安装,大概率是你在某个项目目录下执行的命令——Cabal v2会优先读取项目本地的依赖状态,而你安装的包在全局存储里,不在项目本地的依赖列表中,所以会显示未安装。
而你在项目.cabal文件里添加build-depends后能正常构建,是因为Cabal在构建项目时,会自动从全局存储中拉取所需依赖,并把这些包的路径传递给GHC,所以GHC能找到它们。
解决方案
这里有几个实用的解决方法,按推荐程度排序:
1. 用Cabal直接启动GHCi(最推荐)
直接让Cabal帮你配置好GHCi的环境,这样就能自动加载你需要的包:
cabal repl --build-depends text-regex-posix, text-regex-tdfa
启动后的GHCi就能直接import Text.Regex.Posix或import Text.Regex.TDFA了,完全不用手动配置路径。
2. 配置GHC环境变量,让它识别Cabal的全局存储
如果你想让普通的ghci命令也能找到这些包,需要把Cabal的全局package database路径添加到GHC_PACKAGE_PATH环境变量中:
- 首先找到Cabal的全局db路径:在Windows 10上,路径大概是
%APPDATA%\cabal\store\ghc-8.6.5\package.db(你可以用cabal v2-exec -- ghc-pkg list命令确认具体路径)。 - 打开命令提示符,执行以下命令(替换成你实际的路径):
setx GHC_PACKAGE_PATH "%APPDATA%\cabal\store\ghc-8.6.5\package.db;%GHC_PACKAGE_PATH%" - 重启你的终端,之后再启动
ghci就能加载这些包了。
3. 不推荐:用ghc-pkg手动注册包
你可以把Cabal安装的包注册到GHC的全局package database里,但这种方法容易导致版本冲突,破坏Cabal的隔离机制,只在万不得已时使用:
ghc-pkg register --global "路径到包的*.conf文件"
(你需要在Cabal的存储目录里找到对应包的.conf文件,路径通常是%APPDATA%\cabal\store\ghc-8.6.5\text-regex-posix-xxx\package.conf.install)
关于v1-install无效的补充
你尝试的v1-install(旧版全局安装)无效,大概率是因为v1安装的包默认存放在%APPDATA%\cabal\packages\ghc-8.6.5下的package database里,同样没有被添加到GHC_PACKAGE_PATH中,所以GHCi还是找不到。用上面的方法2把这个路径也加到环境变量里就能解决,但还是更推荐用方法1或方法2的v2版本方案。
内容的提问来源于stack exchange,提问作者toni rmc

