Haskell 如何编写一个结合了其他nix shell环境的shell.nix文件?

Haskell 如何编写一个结合了其他nix shell环境的shell.nix文件?,haskell,nix,nixpkgs,Haskell,Nix,Nixpkgs,我想编写一个shell.nix文件,该文件将为我提供一个开发环境,其中包括开发人员工具+haskell依赖项。我希望将我的nix表达式分开—现在这意味着一个文件包含关于我的编辑器的信息,另一个文件包含关于我的haskell项目的信息 我试图建立一个非常基本的环境,但无法让它工作。我有两个文件,可以从中创建nix shell: # my-haskell-shell.nix - generated by cabal2nix --shell { nixpkgs ? import <nixpkg

我想编写一个
shell.nix
文件,该文件将为我提供一个开发环境,其中包括开发人员工具+haskell依赖项。我希望将我的nix表达式分开—现在这意味着一个文件包含关于我的编辑器的信息,另一个文件包含关于我的haskell项目的信息

我试图建立一个非常基本的环境,但无法让它工作。我有两个文件,可以从中创建
nix shell

# my-haskell-shell.nix - generated by cabal2nix --shell

{ nixpkgs ? import <nixpkgs> {}, compiler ? "default", doBenchmark ? false }:

let

  inherit (nixpkgs) pkgs;

  f = { mkDerivation, base, cabal-install, hpack, stdenv }:
      mkDerivation {
        pname = "hello-world";
        version = "0.1.0.0";
        src = ./.;
        isLibrary = false;
        isExecutable = true;
        libraryToolDepends = [ hpack ];
        executableHaskellDepends = [ base ];
        executableToolDepends = [ cabal-install hpack ];
        preConfigure = "hpack";
        license = stdenv.lib.licenses.mit;
      };

  haskellPackages = if compiler == "default"
                       then pkgs.haskellPackages
                       else pkgs.haskell.packages.${compiler};

  variant = if doBenchmark then pkgs.haskell.lib.doBenchmark else pkgs.lib.id;

  drv = variant (haskellPackages.callPackage f {});

in
  if pkgs.lib.inNixShell then drv.env else drv
然而,这不起作用。它似乎试图构建neovim环境:

 $ nix-shell
these derivations will be built:
  /nix/store/k9ygid1wl75vf2nq7jzfh32mv5f8i956-neovim-dev-env.drv
building '/nix/store/k9ygid1wl75vf2nq7jzfh32mv5f8i956-neovim-dev-env.drv'...
unpacking sources
variable $src or $srcs should point to the source
builder for '/nix/store/k9ygid1wl75vf2nq7jzfh32mv5f8i956-neovim-dev-env.drv' failed with exit code 1
error: build of '/nix/store/k9ygid1wl75vf2nq7jzfh32mv5f8i956-neovim-dev-env.drv' failed

我不知道如何解决这个问题;我做错了什么?我怀疑也许我不应该使用mkDerivation?

设法找到了解决方案。也许有更好的方法,但这是有效的:

假设你有一个包裹。那么yaml

 $ cabal2nix . > app.nix
灵感来自

 $ nix-shell
these derivations will be built:
  /nix/store/k9ygid1wl75vf2nq7jzfh32mv5f8i956-neovim-dev-env.drv
building '/nix/store/k9ygid1wl75vf2nq7jzfh32mv5f8i956-neovim-dev-env.drv'...
unpacking sources
variable $src or $srcs should point to the source
builder for '/nix/store/k9ygid1wl75vf2nq7jzfh32mv5f8i956-neovim-dev-env.drv' failed with exit code 1
error: build of '/nix/store/k9ygid1wl75vf2nq7jzfh32mv5f8i956-neovim-dev-env.drv' failed
 $ cabal2nix . > app.nix
# shell.nix
let
  p = import <nixpkgs> {};
  app = p.haskellPackages.callPackage (./app.nix) {};
  lib = p.haskell.lib;
in
lib.overrideCabal app (old: { buildTools = [p.my-nvim] ++ (old.buildTools or []); })
$ nix-shell

$ nvim # works
$ ghc # works