我有一个使用CMake构建的大型多语言项目。其中有一部分是用Haskell编写的,它使用stack
来构建。CI构建由Gitlab CI处理,并在docker执行器中运行。在创建docker镜像期间,使用stack setup
下载ghc。构建的haskell部分仍然需要相当长的时间,因为它为每个构建重新下载和构建所有必需的包。
为了缓存本地数据库,我添加了
cache:
paths:
- src/utils/.stack-work
(堆栈YAML文件位于src/utils/
中,三个Haskell包也位于那里的dirs中)
这并没有真正加快构建的速度。在更仔细地阅读了堆栈数据库之后,我意识到快照被放在STACK_ROOT
(~/.stack
)中。研究堆栈的选项表明,没有办法指定快照应该与STACK_ROOT
分开存储。
考虑到Gitlab CI似乎只允许在构建目录中缓存项目,我认为我剩下两个选项:
- 使用
stack --stack-root <folder under build> ...
将STACK_ROOT
放在构建目录中,然后缓存整个内容。这意味着我的缓存从不到100M增加到1.6G! - 预取我们当前使用的快照到我们用于构建的docker映像中。
现在是我的问题:
- 我是否认为快照总是存储在
STACK_ROOT
中? - 是否有一种方法可以预取特定的快照,类似于
stack setup
如何获取ghc?
或者我完全错了,有更好的方法来限制缓存大小。
经过@dsign的评论和一点思考,我得出了一个令人满意的解决方案:
- 是的,在docker映像构建过程中通过(某种程度上)构建软件来预抓取是可以的。
- 预取方式为运行
stack install --only-dependencies
。