【问题标题】:What is reason not to use stack --nix when I using nix?使用 nix 时不使用 stack --nix 的原因是什么?
【发布时间】:2017-09-07 07:31:58
【问题描述】:

我在NixOS,但我认为这个问题应该适用于任何使用nix的平台。

我通过试用发现stack 可以与几个选项一起使用来构建项目,但我不完全理解它们之间的区别,

  1. stack
  2. stack --system-ghc
  3. stack --nix

问题

  1. 如果我使用的是 nix(在我的例子中是 NixOS),我有什么理由不想使用 --nix 参数吗?
  2. nix处理haskell项目的方式是什么,应该用cabal(cabal2nix)代替stack吗?
  3. 我发现stack正在重建很多nix已经安装的库,这是什么原因?

【问题讨论】:

    标签: haskell-stack nix


    【解决方案1】:
    1. 据我了解,堆栈的 --nix 选项使用 nix-shell 来管理 非 Haskell 依赖项(而不是要求它们处于堆栈运行的“全局”环境中从)。如果您想在 nix 上使用 stack 工具,这可能是一个好主意。 Stack 通常也会安装自己的 GHC:--system-ghc 选项可以防止这种情况,并要求它在运行它的“全局”环境中使用 GHC。我相信使用--nixstack 也会要求 Nix 处理 GHC 版本控制,所以在 Nix 系统上,我建议使用 --nix 构建而不使用 --system-ghc

    2. 至少在我看来,在使用 Nix 时最好避免使用堆栈工具。这是因为堆栈,即使在使用--nix 运行时,也不会通知 Nix 它想要构建的 Haskell 包:它自己在 ~/.stack 中构建它们,并且不与 Nix 商店共享它们。如果您的项目使用最新的 nixpkgs 版本的 Haskell 包构建,或者对这些包的简单覆盖相对较少,cabal2nix 是一个很好的解决方案,可以确保 Haskell 库只构建一次(由 Nix 构建)。如果您想确保使用与stack 相同的包版本构建项目,我会推荐stackage2nixstack2nix。我个人一直在使用与stackage2nix 相关的nixpkgs-stackage 覆盖:这为您提供了nixpkgs 中的LTS 包集和nixpkgs.haskell.packages.stackage.lib.callStackage2nix,您可以在default.nix/shell.nix 中使用,如下所示: callStackage2nix (baseNameOf ./.) (cleanSource ./.).${(baseNameOf ./.)}cleanSource 的任何定义都适合您的项目(这可以使用 filterSource 删除一些不应该真正被视为项目一部分的文件,例如自动保存、构建目录等)。

      使用此设置,而不是使用stack 工具,对于项目的交互式工作,您应该使用nix-shell 设置一个环境,其中 Nix 已构建您项目的所有依赖项并“安装”它们。然后你可以只使用cabal-install 来构建你的项目,没有任何依赖问题或(重新)构建依赖。

    3. 如上所述,stack 不与 Nix 协调,并尝试在 ~/.stack 中构建每个 Haskell 依赖项本身。如果您想将所有 Haskell 软件包保留在 Nix 商店(我会推荐),同时遵循与 Stack 相同的构建计划,您将需要使用其中一个链接工具或类似工具。

    【讨论】:

      猜你喜欢
      • 2011-06-10
      • 1970-01-01
      • 2020-02-03
      • 2019-11-22
      • 2018-01-07
      • 1970-01-01
      • 2019-11-22
      • 2021-02-15
      • 1970-01-01
      相关资源
      最近更新 更多