MacOS El Capitan下stack install wreq报cannot satisfy -package-id错误
我之前在旧版本MacOS上用Stack处理Haskell依赖时,也碰到过这种<command line>: cannot satisfy -package-id的错误,大多是依赖版本冲突或者缓存干扰导致的。结合你给出的环境信息(MacOS El Capitan、Stack 1.6.1、GHC 8.2.2),可以试试下面几个解决方案:
方案一:清理Stack缓存并重新构建
这种错误最常见的诱因就是缓存的旧依赖和当前项目所需版本不匹配,清理后强制Stack重新拉取正确的依赖:
- 执行全量清理命令:
stack clean --full - 删除项目本地的构建缓存目录:
rm -rf .stack-work - 重新尝试安装wreq:
stack install wreq
方案二:指定兼容的依赖版本
Haskell Platform 8.2.2对应的Stack resolver是lts-11.x,部分旧依赖包在这个resolver里可能存在版本冲突。你可以修改项目根目录的stack.yaml文件,添加明确的依赖版本约束:
打开stack.yaml,找到extra-deps字段(如果没有就新增),添加以下内容:
extra-deps: - exceptions-0.8.3 - blaze-builder-0.4.0.2 - stm-2.4.4.1 - text-1.2.2.2
保存文件后,重新执行stack install wreq,Stack会严格按照指定版本拉取并构建依赖,避免版本不匹配问题。
方案三:升级Stack版本(注意El Capitan兼容性)
你当前使用的Stack 1.6.1是比较旧的版本,对依赖解析的处理可能存在bug。El Capitan(OS X 10.11)支持的最新Stack版本是2.7.5,你可以升级到这个版本:
curl -sSL https://get.haskellstack.org/ | sh -s -- --binary-version 2.7.5
升级完成后,再重新执行stack install wreq,新版本的Stack对依赖冲突的处理会更完善。
方案四:用Cabal作为替代安装方式
如果Stack的问题始终无法解决,可以尝试用Cabal来安装wreq:
- 先更新Cabal包索引:
cabal update - 在项目目录初始化Cabal沙箱(避免全局依赖污染):
cabal sandbox init - 安装wreq:
cabal install wreq
错误原因补充
这种cannot satisfy -package-id错误本质是构建过程中,编译器找不到指定版本的依赖包——要么是缓存里的版本和构建命令要求的不匹配,要么是resolver自动选择的依赖版本存在隐性冲突,旧系统的兼容性限制也可能导致部分包的编译状态异常。
内容的提问来源于stack exchange,提问作者Leo Zhang

