簡體   English   中英

僅在沒有堆棧的情況下構建 LTS 依賴項。yaml

[英]Build LTS dependencies only with no stack.yaml

我想實現一個具有三個階段的多級 Dockerfile:

  1. 拉取fpco/stack-build:lts-17.12並構建所有 LTS 依賴項
  2. 復制stack.yamlpackage.yml並構建所有額外的deps
  3. 復制. 並構建實際項目

到目前為止,我設法將 2 和 3 分開,但 1 和 2 仍然一起執行,這意味着每次stack.yamlpackage.yaml都需要重新編譯。 每次大約需要 20 分鍾,而在本地開發人員(沒有 Docker)中,當我修改stack.yamlpackage.yaml時,通常只會很快得到“新的東西”。

在單獨的 Docker 階段執行此“僅 LTS”首次編譯將允許 Docker 緩存結果並避免一直重新編譯所有內容。

當我嘗試在沒有 YAML 文件的情況下stack build --dependencies-only時,Stack 抱怨此文件夾不是 Stack 項目目錄。

是否可以只預編譯沒有yaml文件的 LTS,然后基於stack.yaml編譯項目?

事實證明,我的問題,正如它所說的那樣,沒有意義。

Stack 不會“編譯整個 LTS”。 它只編譯項目依賴項需要的模塊。 因此,如果沒有stack.yamlpackage.yaml (或project.cabal ),它什么也做不了。

一種解決方法是使用帶有堆棧long-term子文件夾stack.yamlpackage.yaml文件列出了依賴關系的text ,說很少會改變bytestring aeson

project-dir/
    long-term/
        stack.yaml
        package.yaml
    stack.yaml
    package.yaml

然后在Dockerfile的第一階段:

FROM fpco/stack-build:lts-17.12 as dependencies

# ...

COPY ./long-term/stack.yaml ./long-term/package.yaml ./
RUN stack build --test --no-run-tests --dependencies-only

COPY ./stack.yaml ./package.yaml ./stack.yaml.lock ./
RUN stack build --test --no-run-tests --dependencies-only

只要不碰這兩個長期文件,Docker 就會愉快地重用緩存的結果。

現在,對“實際”堆棧進行一行更改stack.yamlpackage.yaml不需要重新編譯整個世界。

--

靈感來源於: https://gist.github.com/and-pete/e8fd63d51121c61d25461bcc2b3fe743

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM