我正在尝试在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环境 - 如果有用,我可以发布更多详细信息。
我过去在另一个系统上构建了一个非常相似的表达式 - 我不确定这个系统会出现什么问题 - 怎么可能会调试这个呢?
答案 0 :(得分:1)
您应该查看错误消息:
variable $src or $srcs should point to the source
您可以在nixpkgs存储库中搜索该错误消息,以准确找到它的生成位置。
发生的事情是您没有提供构建器shell脚本,因此nixpkgs只是想根据您的其他mkDerivation
参数猜测如何构建项目。但它无法猜测如何构建你的东西,因为你没有给它一些源文件来编译。我建议您编写类似builder = ./builder.sh
的内容来添加构建器脚本,然后在该文件中添加用于构建软件的命令。
答案 1 :(得分:1)
在Nix中,构建包时需要考虑两个派生函数:
derivation
由Nix提供。stdenv.mkDerivation
由Nix Packages Collection提供。 mkDerivation
使用derivation
,因此在使用mkDerivation
时,了解他们两者的工作方式非常重要。对于您的特定问题,问题是derivation
有三个必需的输入:
必须有一个名为 system 的属性,其值必须是字符串 指定Nix平台标识符,例如&#34; i686-linux&#34;要么 &#34; PowerPC的达尔文&#34;
必须有一个名为 name 的属性,其值必须是字符串。 这被nix-env用作包的符号名称,它是 附加到派生的输出路径。
必须有一个名为 builder 的属性来标识该程序 执行以执行构建。它可以是推导 或源(本地文件引用,例如./builder.sh)。
现在,mkDerivation
通过提供系统和构建器属性来处理其中两个必需的输入;当然,你可以覆盖。但是,因为mkDerivation
提供了自己的构建器,它旨在构建基于./configure
,make
,make install
的程序包,所以它具有它自己的一套要求。也就是说,您提供了一个指向源代码的src
属性。通常,fetchurl
用于提供src
属性,但源的Nix路径(不是字符串)也应该有效。
如果mkDerivation
提供的默认构建器不是您需要的,那么您需要编写自己的构建器。另一方面,如果它确实提供了您所需要的,那么您只需确保提供所需的输入。