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
,但不确定。
答案 0 :(得分:4)
我的理解是,一旦你选择了一个解析器,堆栈就会#"缓存"包裹如果:
解析程序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
版本。