[(Haskell)堆栈通过GitHub Actions构建源文件的缓存

问题描述 投票:7回答:1

[使用stack build在本地构建Haskell项目时,仅重新编译已更改的源文件。不幸的是,我无法让Stack在GitHub Actions上表现得像这样。有什么建议吗?

示例

[我用Lib.hsFib.hs创建了一个简单的示例,我什至还检查了在构建之间更新了缓存的.stack-work文件夹,但是即使只更改了一个,它也总是编译两个文件。

这里是示例:

  1. ((不使用缓存,同时构建Lib.hsFib.hs +依赖项:https://github.com/MarekSuchanek/stack-test/runs/542163994] >>
  2. (仅Lib.hs会更改,同时构建Lib.hsFib.hs):https://github.com/MarekSuchanek/stack-test/runs/542174351
  3. 我可以从日志(详细的堆栈)中观察到缓存中的某些内容正在更新,但是我完全不清楚是什么以及为什么。它正确地发现只有Lib.hs被更改了:“ stack-test-0.1.0.0: unregistering (local file changes: src/Lib.hs)”,所以我不明白为什么所有这些都被编译了。我注意到在2中。Fib.hi.stack-work中未更新,但其他(Fib.oFib.dyn_hiFib.dyn_o)已更新。

〜/ .stack的缓存可以正常进行,并且在不更改源文件的情况下也可以不生成。当然,这是一个虚拟的示例,但是我们有不同的项目,其中包含更多的源文件,可以大大加快构建速度。当更改非源文件(例如README文件)时,则未按预期构建任何文件。

[使用堆栈构建在本地构建Haskell项目时,仅重新编译已更改的源文件。不幸的是,我无法让Stack在GitHub Actions上表现得像这样。任何...

haskell caching cabal haskell-stack github-actions
1个回答
1
投票

此问题的罪魁祸首是堆栈使用时间戳(就像许多其他工具一样)来确定源文件是否已更改。当您在CI上还原缓存并正确执行时,所有依赖项都不会重建,但是源文件的问题是,当CI提供程序为您克隆存储库时,将为该存储库中的所有文件设置时间戳到克隆它的日期和时间。

© www.soinside.com 2019 - 2024. All rights reserved.