nix - 如何使用 Nix niv 引用 github 项目?

标签 nix

我目前正在使用以下内容固定 nixpkgs 以使项目可重现(使用 https://github.com/nmattia/niv ):

{
  nixpkgs ? import <nixpkgs> {}
, compiler ? "default"
, doBenchmark ? false
, sources ? import ./nix/sources.nix
}:

let

  niv = import sources.nixpkgs {
    overlays = [
      (_ : _ : { niv = import sources.niv {}; })
    ] ;
    config = {};
  };
  inherit (niv) pkgs;
...

有了以上,我就可以nix-build成功了,虽然我不是 100% 确定它正在使用 niv按预期固定封装。

尽管如此,我现在正在尝试引用一个 github 项目 - 但我遇到了错误( ...called without required argument... )?

我的尝试:

运行后niv add ... :
nix-shell
error: 'f' at /home/chris/fromLaptopt/usbflash/Haskell/UraniumZuluGooseberry/shell.nix:18:7 called without required argument 'platinumpitanga', at /nix/store/j6spkp2a2sqd65db1sj9zzpgrfnkrwrp-source/pkgs/development/haskell-modules/make-package-set.nix:87:27

这是我正在使用的整个 shell.nix。请注意,我确实意识到我仍然需要“覆盖”Haskell/GHC 包 - 请忽略这一点 - 我只是希望我现在需要弄清楚如何引用外部 github 包。
{
  nixpkgs ? import <nixpkgs> {}
, compiler ? "default"
, doBenchmark ? false
, sources ? import ./nix/sources.nix
}:

let

  niv = import sources.nixpkgs {
    overlays = [
      (_ : _ : { niv = import sources.niv {}; })
    ] ;
    config = {};
  };
  inherit (niv) pkgs;

  f = { mkDerivation, aeson, base, bytestring, containers, hpack
      , influxdb, lens, platinumpitanga, pretty-simple, split, stdenv
      , stm, string-conversions, text, time, vector
      }:
      mkDerivation {
        pname = "UraniumZuluGooseberry";
        version = "0.1.0.0";
        src = ./.;
        isLibrary = false;
        isExecutable = true;
        libraryToolDepends = [ hpack ];
        executableHaskellDepends = [
          aeson base bytestring containers influxdb lens platinumpitanga
          pretty-simple split stm string-conversions text time vector
        ];
        preConfigure = "hpack";
        license = stdenv.lib.licenses.bsd3;
      };

  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

最佳答案

  niv = import sources.nixpkgs {
    overlays = [
      (_ : _ : {
        niv = import sources.niv {};
        platinumpitanga = niv.pkgs.haskellPackages.callCabal2nix "platinumpitanga"
          (sources.PlatinumPitanga) {} ;
      })
    ] ;
    config = {};
  };
  inherit (niv) pkgs;

我认为以上就是所需要的(至少我已经设法在 nix-build 上走得更远)。

本质上sources.PlatinumPitanga - 这是“存储库”的名称。

关于nix - 如何使用 Nix niv 引用 github 项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57385150/

相关文章:

nix - 这个元素真的是一个集合吗?

linux - Nix/OS 架构概述?

nix - 如何再次构建存储路径 `nix-build`?

go - 在 nix 中使用 buildGoPackage 时出现“没有这样的文件或目录”错误

haskell - cabal/stack/nix可以用来编译成动态库吗?

linux - 是否可以让 Nix 包管理器只安装运行时依赖项?

nix - nix 路径类型何时进入 nix 存储,何时不进入?

python - 在 Nixpkgs 中,是什么让 Python 派生成为应用程序而不是库?

nix - 直接运行二进制文件工作正常,但 execve 失败

haskell - 如何在 NixOS 上使用新的 haskell-ng 基础架构?