如何从 shell.nix 为堆栈项目设置 cabal 标志?

How to set cabal flag from shell.nix for stack project?

默认情况下,我在没有 nix 的情况下构建我的项目,并且可执行文件是 link 静态编辑的。但是当使用 nix 构建时,我想 link 动态地代替它。所以我添加了一个开关 myproj.cabal:

flag dynamic
  description: Build only dynamic binaries
  default: False

executable RunMe
  ghc-options:         -O2 -Wall
  if !flag(dynamic)
    ghc-options: -optl-static -static

现在我可以使用

构建项目
stack --nix --nix-packages=zlib install --flag myproj:dynamic

为了避免每次都传递命令行选项,我创建了 shell.nix:

{ghc}:
with (import <nixpkgs> {});
haskell.lib.buildStackProject {
  inherit ghc;
  name = "myproj";
  buildInputs = [ zlib ];
}

现在,我不知道如何将标志从 nix 文件传递​​给 cabal。根据buildStackProject定义,我尝试设置buildPhase,例如

haskell.lib.buildStackProject {
  ...
  buildPhase = "stack build --flag=myproj:dynamic";
}

但它似乎并没有改变任何东西。如何从 nix 文件将标志传递给 cabal?

不幸的是,stack nix 集成相当落后。它不使用 nix 来构建你的包(尽管非常具有误导性buildStackPackage),只是为了创建一个具有 GHC 和本机依赖项的环境。您必须使用 stack 本身来构建项目,并且由于 stack 将 运行 cabal,它应该仍然可以使用该标志。 stack nix 集成将 not 生成一个 .nix 文件,其中的依赖项由 stack 解析,所以你不能用 nix-build 构建你的项目并且没有意义输入 nix-shell。为此,您必须使用 stack2nixstackage2nix 之类的工具。

所以回顾一下。上面的 shell.nix 看起来不错。将此添加到您的 stack.yaml:

nix:
    shell-file: shell.nix

并使用堆栈构建项目:

stack --nix --flag myproj:dynamic

应该像往常一样使用标志构建项目,但使用 nix 中的 GHC 和 zlib。