如何避免堆栈不必要的重建?

时间:2015-10-05 23:52:23

标签: haskell haskell-stack

Stack通常会缓存包依赖项构建,以便在将来的构建中节省时间,但我注意到在实践中很多情况都没有发生。当它工作时,它可以节省大量时间,因为构建依赖关系通常需要半个小时或更长时间。

经过一些工作,我已经能够找到一个简单的例子来说明这个问题,并且想知道是否有人可以帮我修复它。注意,这个问题只涉及新的构建,比如克隆之后......同一个克隆的第二个构建实际上很快就会发生。

如果我编译这个非常简单的Main.hs

import Network.Haskoin.Internals

main = undefined

使用此stack.yaml

resolver: lts-2.15
packages:
- '.'
extra-deps: 
- haskoin-0.1.0.2
- json-rpc-0.2.1.6
- pbkdf-1.1.1.1
- text-1.1.1.4

flags: {}

和这个.cabal文件

name:                simple
version:             0.1.0.0
cabal-version:       >=1.10

executable simple-exe
  hs-source-dirs:      src
  main-is:             Main.hs
  build-depends:       base
                     , haskoin
  default-language:    Haskell2010
每次重新克隆源代码时,

堆栈都会重建每个依赖项。

我猜这可能与extra-deps有关,特别是text-1.1.1.4,但不确定。

1 个答案:

答案 0 :(得分:4)

我的理解是,一旦你选择了一个解析器,堆栈就会#"缓存"包裹如果:

  1. 包装在Stackage中,用于解析器,
  2. 该软件包使用解析程序指定的完全相同的依赖版本集构建。
  3. 解析程序LTS-2.15选择的软件包版本可在此页面上找到:

    https://www.stackage.org/lts-2.15

    "缓存"在你的机器上为解析器LTS-2.15位于如下目录:

    ~/.stack/snapshots/x86_64-osx/lts-2.15/7.8.4/pkgdb
    

    例如,您的项目使用Stackage LTS-2.15中的blaze-builder-0.4.0.1。但是,blaze-builder取决于text,如果您在LTS-2.15中使用text版本(即text-1.2.0.6),那么堆栈会缓存blaze-builder-0.4.0.1 LTS-2.15快照目录(假设blaze-builder的所有其他依赖项与LTS-2.15中的版本匹配。)但是,由于您为text指定了版本1.1.1.4,因此堆栈不会保存在LTS-2.15快照目录中生成blaze-builder。它将保存在项目的.stack-work目录中。

    由于许多软件包依赖于text,我的建议是使用Stackage解析器中列出的text版本。