构建Nix包时遇‘fetchurl参数无值’错误,求问题原因
Nix包构建报错根源分析
我尝试构建一个Nix包,相关文件及操作如下:
a.nix 文件内容
{ lib , stdenv , fetchurl , testVersion , hello }: stdenv.mkDerivation { name = "libfoo-1.2.3"; src = fetchurl { url = "http://example.org/libfoo-1.2.3.tar.bz2"; sha256 = "0x2g1jqygyr5wiwg4ma1nd7w4ydpy82z9gkcv8vh2v8dn3y58v5m"; }; }
执行命令与首次报错
执行bash命令:
nix-build a.nix
出现报错:
cannot evaluate a function that has an argument without a value ('fetchurl')
改用命令后的新报错
有人建议改用如下命令:
nix-build '<nixpkgs>' a.nix
但又出现新的报错:
Please be informed that this pseudo-package is not the only part of Nixpkgs that fails to evaluate. You should not evaluate entire Nixpkgs without some special measures to handle failing packages, like those taken by Hydra.
我不确定这是否是解决问题的正确方向,且lib导入没有问题,想请教这个问题的根源是什么?
问题根源与解决方法
1. 首次报错的核心原因
你的a.nix是函数式包定义,它声明了lib、stdenv、fetchurl等依赖参数,但直接执行nix-build a.nix时,Nix没有渠道获取这些参数的实际值——这些依赖全部来自nixpkgs包集合,单独执行这个文件时,Nix不知道去哪里查找并注入这些参数。
2. 错误命令的问题
nix-build '<nixpkgs>' a.nix的用法完全错误。<nixpkgs>指向完整的Nixpkgs仓库,这个命令会尝试把整个Nixpkgs作为参数传递给你的a.nix,这违背了函数式包的调用逻辑,进而触发Nixpkgs整体求值的报错(完整Nixpkgs求值需要Hydra这类工具的特殊处理,普通场景下直接求值会失败)。
3. 正确的构建方式
要构建这个包,需要让Nix从nixpkgs中自动注入所需参数,有两种常用方式:
- 方式一:通过default.nix调用
创建default.nix文件:
{ pkgs ? import <nixpkgs> {} }: pkgs.callPackage ./a.nix {}
然后执行:
nix-build default.nix
- 方式二:命令行直接注入
无需额外文件,直接执行:
nix-build -E 'with import <nixpkgs> {}; callPackage ./a.nix {}'
这两种方式都会利用callPackage自动匹配并传入a.nix声明的所有参数,解决函数参数缺失的问题。
内容的提问来源于stack exchange,提问作者Pierre-olivier Gendraud
相关产品推荐
相关产品推荐

