如何通过Stack正确添加tarball格式的Cardinality包作为mylib依赖?
解决Stack中依赖tarball包的跨项目构建问题
问题根源
Stack在构建项目时,只会使用当前项目(这里是myapp)的stack.yaml生成构建计划,不会自动继承依赖项目(mylib)的extra-deps配置。虽然你在mylib的stack.yaml里指定了Cardinality的tarball依赖,但myapp的Stack环境并不知道这个配置,所以解析mylib的依赖时找不到Cardinality的版本信息,进而抛出错误。
解决方案
方案1:在myapp的stack.yaml中添加相同的extra-dep配置
这是最直接的解决方式,把mylib里的Cardinality依赖配置复制到myapp的stack.yaml中:
extra-deps: # 其他已有extra-dep... - location: https://hackage.haskell.org/package/Cardinality-0.2/Cardinality-0.2.tar.gz extra-dep: true
配置完成后,myapp的Stack环境就能识别这个tarball包,构建计划可以正常生成。
方案2:本地tarball+相对路径(更适合团队协作)
如果不想让每个依赖mylib的项目都重复写远程URL,可以把Cardinality的tarball下载到mylib项目的本地目录(比如新建./deps文件夹存放),然后修改mylib的stack.yaml:
extra-deps: - location: ./deps/Cardinality-0.2.tar.gz extra-dep: true
接着在myapp的stack.yaml里用相对路径引用这个本地tarball:
extra-deps: # 其他已有extra-dep... - location: ../mylib/deps/Cardinality-0.2.tar.gz extra-dep: true
这种方式避免了依赖远程URL的可用性,也方便团队成员同步依赖包。
方案3:通过include继承mylib的Stack配置(适合同Resolver的项目)
如果mylib和myapp使用相同的Resolver,你可以在myapp的stack.yaml里直接引入mylib的配置,自动继承mylib的extra-deps:
# 先引入mylib的stack配置 include: ../mylib/stack.yaml # 再配置myapp自身的packages packages: - . - ../mylib
注意:如果两个项目的Resolver、全局配置存在冲突,这种方式可能引发问题,仅推荐在同环境的项目中使用。
额外提示
- 不要轻易使用
allow-newer: true,这会忽略所有版本约束,可能引入隐蔽的依赖冲突,导致后续构建排查困难。 stack solver虽然能尝试自动生成配置,但对于tarball这类非标准Hackage依赖,它的支持并不稳定,手动配置更可靠。
内容的提问来源于stack exchange,提问作者RandomB
相关产品推荐
相关产品推荐

