You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:01:01