为什么cabal会在.cabal/lib中安装已重新安装的软件包

J. *_*son 14 haskell cabal

我正在尝试使用CircleCI来构建一些Haskell项目.Circle /home/ubuntu/.cabal在每次构建后自动缓存目录,我认为这会加快构建速度,但它们似乎只需要很长时间 - 所有跳过的都是下载步骤.

我正在使用的构建指令是

cabal update
cabal install --only-dependencies --enable-tests
cabal configure --enable-tests
cabal build
cabal test
Run Code Online (Sandbox Code Playgroud)

我预计该install --only-dependencies步骤会看到缓存并运行得更快.

可能出了什么问题?

rtp*_*son 5

几个月前, Reddit上有一场关于阴谋集团问题的精彩讨论。我记得 Haskell 没有指定的应用程序二进制接口,并且ghc编译器在编译期间做了很多积极的库间图缩减。因此,Haskell 应用程序中不存在稳定的库安装——任何库都可能被拖下来并针对全套已安装的库进行重新编译。

这里的底线是缓存.cabal/lib目录对加速安装没有任何作用。依赖项的重新编译总是会发生。除了使用沙箱之外hsenv,最好的方法是在调用时指定完整的依赖库集cabal install。这样,可以提前计算依赖关系,并且编译应该只发生一次。

Haskell 大师们,如果我在这里所说的有任何错误,请随时纠正我。我已经脱离 Haskell 循环几个月了,我知道阴谋/库问题最近受到了很多关注。