Nix& Haskell - 使用cabal2nix的default.nix和通用shell.nix

时间:2015-01-28 21:06:36

标签: haskell nix

来自一个非常基本的cabal文件

cabal2nix ./. > default.nix 

然后是

的shell.nix
let
  pkgs = import <nixpkgs> {};
  haskellPackages = pkgs.haskellPackages_ghc784.override {
    extension = self: super: {
      thispackage = self.callPackage ./default.nix {};
    };
  };
in pkgs.myEnvFun {
     name = haskellPackages.thispackage.name;
     buildInputs = [
       (haskellPackages.ghcWithPackages (hs: ([
         hs.cabalInstall
       ] ++ hs.thispackage.propagatedNativeBuildInputs)))
     ];
   }

当在nix-shell和正在运行的cabal配置时,它会抱怨缺少诸如文本之类的包。

如果我将文本包明确地放入shell.nix中,例如

let
  pkgs = import <nixpkgs> {};
  haskellPackages = pkgs.haskellPackages_ghc784.override {
    extension = self: super: {
      thispackage = self.callPackage ./default.nix {};
    };
  };
in pkgs.myEnvFun {
     name = haskellPackages.thispackage.name;
     buildInputs = [
       (haskellPackages.ghcWithPackages (hs: ([
         hs.cabalInstall
         hs.text
       ] ++ hs.thispackage.propagatedNativeBuildInputs)))
     ];
   } 

cabal配置很好,但我希望hs.thispackage.propagatedNativeBuildInputs提供这些包。

可以在

看到非常基本的haskell项目

https://github.com/fatlazycat/haskell-nix-helloworld

假设你能以这种方式工作,我错了吗?

由于

1 个答案:

答案 0 :(得分:4)

Haskell 使用propagatedNativeBuildInputs属性 将构建输入传播到依赖于它们的其他构建。您的 但是,包不是一个库---它是一个可执行文件---所以没有 需要传播构建输入,因此propagatedNativeBuildInputs是 空。相反,您将找到所需的信息 hs.thispackage.extraBuildInputs

一般来说,这类nix-shell环境的定义 在发布-15.09分支(或nixos-unstable)中变得容易多了, 虽然。只需运行cabal2nix --shell . >shell.nix即可获得shell.nix 您可以使用nix-build shell.nix以及for构建的文件 使用nix-shell进入交互式开发环境。

http://nixos.org/nixpkgs/manual/#users-guide-to-the-haskell-infrastructure有 关于这个主题的更多信息。