4

从一个非常基本的 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

假设您可以以这种方式工作,我错了吗?

谢谢

4

1 回答 1

4

Haskell库使用该propagatedNativeBuildInputs属性将其构建输入传播到依赖它们的其他构建。但是,您的包不是库 --- 它是可执行文件 ---,因此无需传播构建输入,因此是空的。相反,您会在 中找到您需要的信息 。propagatedNativeBuildInputshs.thispackage.extraBuildInputs

一般来说,这些nix-shell环境的定义在 release-15.09 分支(或 nixos-unstable)中变得容易多了。只需运行cabal2nix --shell . >shell.nix,您就会得到一个shell.nix 文件,您可以使用该文件进行构建,也可以nix-build shell.nix使用nix-shell.

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

于 2015-11-19T15:16:54.667 回答