2015-10-05 81 views
1

堆棧通常會緩存程序包依賴關係構建,以節省將來構建中的時間,但我注意到實踐中發生這種情況的很多情況。當它工作時,它可以是一個巨大的節省時間,因爲建築物的依賴往往需要半小時或更長的時間。如何避免不必要的堆棧重建?

經過一番努力,我已經能夠隔離一個簡單的例子來說明這個問題,並想知道是否有人可以幫我修復它。注意,這個問題只涉及新的構建,就像在克隆之後......同一個克隆的第二個構建實際上很快。


如果我編譯使用這個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 

堆棧將重建這個非常簡單的Main.hs

import Network.Haskoin.Internals 

main = undefined 

每次我重新克隆s時,每個依賴項都會被刪除我們的代碼。

我在猜測它可能與extra-deps有關,特別是text-1.1.1.4,但不確定。

回答

3

我的理解是,一旦你選擇了一個解析器,棧將「緩存」一包,如果:

  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,如果您在LTS-2.15(即text-1.2.0.6)中使用text的版本,則堆棧將在LTS-2.15快照目錄中緩存blaze-builder-0.4.0.1(假定blaze-builder的所有其他依賴項均與LTS中的版本匹配)但是,由於您已經爲text指定了版本1.1.1.4,因此堆棧將不會將生成的blaze-builder保存在LTS-2.15快照目錄中。它將被保存在該項目的.stack-work目錄中。

由於如此多的包依賴於text,我的建議是使用Stackage解析器中列出的text版本。

+1

相關:在Stack問題追蹤器中,關於緩存額外代碼的討論只是在https://github.com/commercialhaskell/stack/issues/1029。使用[自定義快照](https://github.com/commercialhaskell/stack/wiki/Custom-Snapshot)可能會有所幫助。 –