如何从 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
。为此,您必须使用 stack2nix
或 stackage2nix
之类的工具。
所以回顾一下。上面的 shell.nix
看起来不错。将此添加到您的 stack.yaml
:
nix:
shell-file: shell.nix
并使用堆栈构建项目:
stack --nix --flag myproj:dynamic
应该像往常一样使用标志构建项目,但使用 nix
中的 GHC 和 zlib。
默认情况下,我在没有 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
。为此,您必须使用 stack2nix
或 stackage2nix
之类的工具。
所以回顾一下。上面的 shell.nix
看起来不错。将此添加到您的 stack.yaml
:
nix:
shell-file: shell.nix
并使用堆栈构建项目:
stack --nix --flag myproj:dynamic
应该像往常一样使用标志构建项目,但使用 nix
中的 GHC 和 zlib。