4

我正在尝试在 Ubuntu 16.04 上使用 Nix。

设置后,我尝试构建以下表达式:

let
  pkgs = import <nixpkgs> {};
  stdenv = pkgs.stdenv;
in rec {
  scalaEnv = stdenv.mkDerivation rec {
    name = "scala-env";
    shellHook = ''
    alias cls=clear
    '';
    CLANG_PATH = pkgs.clang + "/bin/clang";
    CLANGPP_PATH = pkgs.clang + "/bin/clang++";
    buildInputs = with pkgs; [
      stdenv
      sbt
      openjdk
      boehmgc
      libunwind
      re2
      clang
      zlib
      ammonite
    ];
  };
} 

但这以错误结束:

*** Downloading ‘https://cache.nixos.org/nar/022mrfa98hxccsn9znr9z9s7sh3kfc5wzvgfx45x5drcz9wq3wyv.nar.xz’ to ‘/nix/store/y1scdckyi7ij30771rl1pdq4s9gj683a-sbt-1.0.1’...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 50.0M  100 50.0M    0     0  12.5M      0  0:00:04  0:00:04 --:--:-- 10.7M

building path(s) ‘/nix/store/9xykkj5z6szrwamji3gshylxca092nv9-scala-env’
unpacking sources
variable $src or $srcs should point to the source
builder for ‘/nix/store/wg0kd6z5kik46xza5xsdqw4yf10ifksv-scala-env.drv’ failed with exit code 1
error: build of ‘/nix/store/wg0kd6z5kik46xza5xsdqw4yf10ifksv-scala-env.drv’ failed
The command '/bin/sh -c $nixenv && nix-build scala-default.nix -A scalaEnv' returned a non-zero code: 100

请注意,这/bin/sh -c $nixenv只是尝试设置 nix 环境 - 如果有帮助,我可以发布更多详细信息。

我过去在另一个系统上构建了一个非常相似的表达式——我不确定这个系统会出现什么问题——如何调试这个?

4

2 回答 2

2

在 Nix 中,构建包时需要考虑两个派生函数:

  1. derivation由 Nix 提供。
  2. stdenv.mkDerivation由 Nix Packages Collection 提供。

mkDerivationderivation在引擎盖下使用,因此在使用时mkDerivation了解它们工作原理很重要。对于您的特定问题,事情是derivation具有三个必需的输入:

必须有一个名为system的属性,其值必须是指定 Nix 平台标识符的字符串,例如“i686-linux”或“powerpc-darwin”

必须有一个名为name的属性,其值必须是字符串。这被 nix-env 用作包的符号名称,并附加到派生的输出路径中。

必须有一个名为builder的属性,用于标识为执行构建而执行的程序。它可以是派生或源(​​本地文件引用,例如,./builder.sh)。

现在,mkDerivation通过提供系统构建器属性来处理其中两个必需的输入;当然,您可以覆盖。但是,因为mkDerivation它提供了自己的构建器,旨在构建基于./configure, make,make install的包,所以它有自己的一组要求。即,您提供一个src指向您的源代码的属性。通常,fetchurl用于提供src属性,但到源的 Nix 路径(不是字符串)也应该有效。

如果提供的默认构建器mkDerivation不是您需要的,那么您需要编写自己的。另一方面,如果它确实提供了你需要的东西,那么你只需要确保你提供了它需要的输入。

您可以分别在此处此处阅读有关derivation和的更多信息。mkDerivation

于 2017-09-06T14:56:50.120 回答
2

您应该查看错误消息:

variable $src or $srcs should point to the source

您可能可以在 nixpkgs 存储库中搜索该错误消息,以准确找到它的生成位置。

发生的事情是您没有提供构建器 shell 脚本,因此 nixpkgs 只是试图根据您的其他mkDerivation参数猜测如何构建您的项目。但是它无法猜测如何构建你的东西​​,因为你没有给它一些源文件来编译。我建议您编写类似builder = ./builder.sh添加构建器脚本的内容,然后在该文件中放入构建软件的命令。

于 2017-09-05T23:25:08.957 回答