为什么 Haskell Stack 一直在下载相同的东西?

Why does Haskell Stack keep downloading the same stuff?

(如果相关,我使用 NixOS。这里是 my NixOS config。)

每次我重新启动计算机,第一次 运行 在项目中堆栈 ghci 时,我的系统不得不下载大量的东西。比如my project montevideo刚开始是这样的:

[jeff@jbb-dell:~/code/music/montevideo]$ stack ghci --ghci-options -Wall
these paths will be fetched (0.47 MiB download, 1.28 MiB unpacked):
  /nix/store/k21l8caw5y607f69vvysvj5p8wcpjmb0-glpk-4.65
  /nix/store/ykbr9ci7l3qmvj6l3i68z6a8r3j5pkbf-pcre-8.44-dev
  /nix/store/z5i9b7dxg5k5hmyspa5kdaj1c7j33zlq-pcre-8.44-bin
copying path '/nix/store/k21l8caw5y607f69vvysvj5p8wcpjmb0-glpk-4.65' from 'https://cache.nixos.org'...
copying path '/nix/store/z5i9b7dxg5k5hmyspa5kdaj1c7j33zlq-pcre-8.44-bin' from 'https://cache.nixos.org'...
copying path '/nix/store/ykbr9ci7l3qmvj6l3i68z6a8r3j5pkbf-pcre-8.44-dev' from 'https://cache.nixos.rg'...
Stack has not been tested with GHC versions above 8.6, and using 8.8.3, this may fail
Stack has not been tested with Cabal versions above 2.4, but version 3.0.1.0 was found, this may fail
Cabal file warning in/home/jeff/code/music/montevideo/montevideo-monome/montevideo-monome.cabal@0:0: A package using secti
on syntax must specify at least
'cabal-version: >= 1.2'.
Decimal             > configure
Decimal             > Configuring Decimal-0.5.1...
Decimal             > build
NumInstances        > configure
Decimal             > Preprocessing library for Decimal-0.5.1..
Decimal             > Building library for Decimal-0.5.1..
Decimal             > [1 of 1] Compiling Data.Decimal
NumInstances        > Configuring NumInstances-1.4...
NumInstances        > Warning: 'ghc-prof-options: -prof' is not necessary and will lead to problems
NumInstances        > when used on a library. Use the configure flag --enable-library-profiling
NumInstances        > and/or --enable-profiling.
NumInstances        > build
StateVar            > configure
NumInstances        > Preprocessing library for NumInstances-1.4..
NumInstances        > Building library for NumInstances-1.4..
NumInstances        > [1 of 5] Compiling Data.NumInstances.PreRequisites
NumInstances        > [2 of 5] Compiling Data.NumInstances.Function
...

大多数项目至少需要 5 分钟。每个项目都需要单独下载。

第一次下载后,我可以随心所欲地在项目中启动和停止 GHCI,而无需重新下载。但是当我重启机器时,我需要重新下载每个项目的库。

您的机器是否会自动关机或重新启动并且不会收集垃圾?

如果你有测试机,可以在

中看到这样的效果
stack ghci --ghci-options -Wall
nix-collect-garbage
stack ghci --ghci-options -Wall

由于堆栈 ghci 的依赖项被添加到 GCROOT,因此它们正在被垃圾收集。然而,垃圾收集只应在您 运行 时发生,除非您的系统配置为在重新启动之间进行垃圾收集。

https://nixos.org/nix/manual/#ssec-gc-roots

使用 nix-shell 您可以将它引入的依赖项添加到 gcroot 中,这样它就不会每次都重新加载它们。

https://nixos.wiki/wiki/Storage_optimization(固定部分)。

但是我不确定目前如何使用堆栈来做到这一点。

在 stack nix 集成文档中似乎确实提到了这一点。

https://docs.haskellstack.org/en/stable/nix_integration/

有选项。

add-gc-roots: true

哪个应该

# false by default. Whether to add your nix dependencies as nix garbage
  # collection roots. This way, calling nix-collect-garbage will not remove
  # those packages from the nix store, saving you some time when running
  # stack build again with nix support activated.
  # This creates a `nix-gc-symlinks` directory in the project `.stack-work`.
  # To revert that, just delete this `nix-gc-symlinks` directory.

但是我似乎无法在我的系统上运行它。

但是你的项目确实编译得很好:-)。

进一步研究表明,这是一个已知问题,未按预期创建这些 gcroot。 :-(

https://github.com/commercialhaskell/stack/issues/4673