我在NixOS
,但我认为此问题应适用于使用nix
的任何平台。
我通过试验发现,stack
可以与几个选项一起用于构建项目,但我不完全理解它们之间的区别,
stack
stack --system-ghc
stack --nix
问题:
--nix
参数吗?nix
方式是什么,应该使用cabal
(cabal2nix)代替stack
? nix
安装的大量库,这是什么原因?答案 0 :(得分:2)
--nix
选项使用nix-shell
来管理 non-Haskell 依赖项(而不是要求它们位于“全局”环境中)该堆栈是从中运行的)。如果要在nix上使用stack
工具,这可能是个好主意。堆栈通常还安装自己的GHC:--system-ghc
选项可防止这种情况,并要求它在运行它的“全局”环境中使用GHC。我相信有了--nix
,stack
也会要求Nix处理GHC版本控制,因此在Nix系统上,我建议使用--nix
而不使用--system-ghc
至少在我看来,使用Nix时最好避免使用堆栈工具。这是因为即使使用--nix
运行时,堆栈也不会通知Nix它要构建的Haskell软件包:它会在~/.stack
内部完全构建它们,而不与Nix共享它们。商店。如果您的项目是使用最新的nixpkgs
版本的Haskell软件包或相对较少的简单覆盖构建的,cabal2nix
是一个很好的解决方案,它将确保Haskell库仅被构建一次(由Nix进行) 。如果要确保使用与stack
相同的软件包版本来构建项目,我建议使用stackage2nix或stack2nix。我个人一直在使用nixpkgs-stackage覆盖层,该覆盖层与stackage2nix
有关:这为您提供了nixpkgs中的LTS软件包集和nixpkgs.haskell.packages.stackage.lib.callStackage2nix
,您可以在{{1}中使用它们} / default.nix
像这样:shell.nix
,无论callStackage2nix (baseNameOf ./.) (cleanSource ./.).${(baseNameOf ./.)}
的定义如何适合您的项目(可以使用cleanSource
删除一些实际上不应该包含在其中的文件项目,例如自动保存,构建目录等)。
使用此设置,而不是使用filterSource
工具,而是要在项目上进行交互式工作,您应该使用stack
来设置一个环境,其中Nix已构建了项目的所有依赖项,并且“安装”。然后,您可以使用nix-shell
仅构建您的项目,而不会出现任何依赖关系问题或(重新)构建依赖关系。
cabal-install
不与Nix协作,而是尝试在stack
中构建每个Haskell依赖项。如果要在遵循与Stack相同的构建计划的同时将所有Haskell软件包保留在Nix商店中(我建议这样做),则需要使用其中一种链接工具或类似工具。