如何从shell.nix为Stack项目设置Cabal编译标志?
在Nix的buildStackProject中传递Cabal标志的正确方法
你遇到的问题在于直接覆盖buildPhase会丢失buildStackProject封装的Nix环境配置和默认构建流程,导致参数无法生效。这里有两种可靠的解决方法:
方法1:使用buildArgs参数(推荐)
buildStackProject函数本身支持buildArgs参数,专门用来传递额外的stack build命令参数。直接在配置里添加这个参数即可:
{ghc}: with (import <nixpkgs> {}); haskell.lib.buildStackProject { inherit ghc; name = "myproj"; buildInputs = [ zlib ]; # 传递Cabal标志给stack build buildArgs = [ "--flag=myproj:dynamic" ]; }
这个方法最简洁,buildArgs会被自动追加到buildStackProject内部的stack build命令后面,既保留了Nix的环境配置,又能正确传递你的标志。
方法2:用overrideAttrs扩展原有构建流程
如果你需要更灵活的定制(比如在原有构建步骤基础上修改),可以用overrideAttrs来扩展buildPhase,而不是完全替换:
{ghc}: with (import <nixpkgs> {}); let baseProject = haskell.lib.buildStackProject { inherit ghc; name = "myproj"; buildInputs = [ zlib ]; }; in baseProject.overrideAttrs (oldAttrs: { # 在原有buildPhase命令后追加标志 buildPhase = "${oldAttrs.buildPhase} --flag=myproj:dynamic"; })
这种方式保留了原有buildPhase中的所有Nix环境设置,只是在执行stack build时添加了你的标志,避免了直接替换带来的环境问题。
验证效果
配置好之后,你可以:
- 运行
nix-shell进入环境,执行stack build,此时会自动带上--flag=myproj:dynamic参数 - 直接用
nix-build构建项目,构建过程也会应用这个Cabal标志
内容的提问来源于stack exchange,提问作者modular
相关产品推荐
相关产品推荐

