2

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, 但不确定。

4

1 回答 1

4

我的理解是,一旦您选择了解析器,堆栈将“缓存”一个包,如果:

  1. 该软件包位于解析器的 Stackage 中,并且
  2. 该包是使用解析器指定的完全相同的依赖版本集构建的。

解析器 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

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

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

于 2015-10-06T01:40:41.030 回答