Haskell Stack项目中Yesod与amazonka依赖构建失败问题
我之前也踩过Yesod和amazonka依赖兼容的坑,尤其是用stack new my-project yesod-mongo脚手架创建的项目,给你几个亲测有效的解决办法:
核心矛盾其实很明确:Yesod 1.6.0是相对稳定的旧版本,它绑定的基础库(比如aeson、http-client这类)版本偏保守,而新版Amazonka通常依赖较新的基础库,直接加依赖自然会冲突。下面是具体的解决思路:
1. 锁定兼容的Amazonka版本
Yesod 1.6.0发布于2019年左右,对应的兼容Amazonka版本是1.6.x系列,这个版本的Amazonka和Yesod 1.6.0的依赖栈重叠度很高。你可以直接在项目的package.yaml(或者.cabal文件)里指定版本:
如果用package.yaml:
dependencies: - base >= 4.10 && < 5 - yesod >= 1.6.0 && < 1.7 - amazonka-core == 1.6.1 - amazonka-ssm == 1.6.1
如果用.cabal文件:
build-depends: base >=4.10 && <5 , yesod >=1.6.0 && <1.7 , amazonka-core ==1.6.1 , amazonka-ssm ==1.6.1
指定这个版本后,基础库的冲突基本就能解决。
2. 用Stack快照锁定整个依赖栈
Stack的resolver快照是官方预编译的兼容依赖集合,Yesod 1.6.0对应的官方快照是lts-14.27,这个快照里的基础库刚好能完美适配Amazonka 1.6.x。
修改项目根目录的stack.yaml,把resolver字段改成:
resolver: lts-14.27
然后运行stack build,Stack会自动帮你拉取所有兼容的依赖包,不需要手动调整太多版本。
3. 排查并解决单个依赖冲突
如果上面的方法还是不行,那就得揪出具体冲突的包。运行stack build --verbose,终端会输出详细的冲突信息,比如:
冲突:yesod需要aeson >=1.4 && <1.5,而amazonka-core需要aeson >=1.5
遇到这种情况,你可以在stack.yaml的extra-deps里强制指定一个双方都兼容的版本:
extra-deps: - aeson-1.4.7.1
添加后再运行stack build,一般就能解决单个包的版本冲突。
4. 升级Yesod版本(可选)
如果你的项目还处于初期,没有太多历史代码,升级到Yesod 1.7.x或最新稳定版会更省心——新版本Yesod依赖的基础库更现代,和最新版Amazonka的兼容性更好。
升级步骤很简单:
- 修改
package.yaml里的yesod版本为>=1.7 && <1.8 - 把
stack.yaml的resolver换成lts-18.x或更高的快照(比如lts-20.x) - 运行
stack upgrade && stack build,处理少量API适配(Yesod 1.7的变动很小,主要是一些细节调整)
内容的提问来源于stack exchange,提问作者user4601931

