Nix自定义包本地构建正常,导入configuration.nix失败求助
问题:自定义Nix包无法通过configuration.nix安装
我需要修改一个Nix包并在系统中使用修改后的版本。当前通过nix-build modified.nix构建、nix-env -i ./result安装均正常无报错,但将该文件导入configuration.nix后,执行nixos-rebuild switch时出现以下错误:
A definition for option `environment.systemPackages."[definition 1-entry 1]"' is not of type `package'. Definition values: - In `/etc/nixos/host.nix': <function, args: {pkgs?}>
已在NixOS 23.11、24.05版本及全新24.05云镜像中测试,期望系统能正常构建该自定义包。
当前代码(modified.nix)
{ pkgs ? import <nixpkgs> { } }: let repo = pkgs.fetchFromGitHub { owner = "TheCyberArcher"; repo = "Respect-My-Internet"; rev = "feb165acd4d39d61d5c29ad7450b14074f0fb031"; sha256 = "1hcd6dqjxi7jnrnd6n1h792qb6xwmiv855rfykh6rgzlwpgydrzk"; }; in pkgs.opensnitch.overrideAttrs (oldAttrs: { preBuild = '' mkdir -p $out/etc/opensnitchd/rules/ mkdir -p $out/etc/opensnitchd/blocklist cp -r ${repo}/blocklist/respect-my-internet.txt $out/etc/opensnitchd/blocklist/ cp -r ${repo}/blocklist/ip/ $out/etc/opensnitchd/ cp -r ${repo}/regex $out/etc/opensnitchd/ cp -r ${repo}/rules/*.json $out/etc/opensnitchd/rules/ ''; })
configuration.nix中的导入代码
environment.systemPackages = [ (import ./modifed.nix) ];
解决方案
错误原因
modified.nix是一个接受pkgs参数的函数,但environment.systemPackages要求的是直接的包对象,而非函数,因此触发类型错误。
解决方法
方法1:导入时传入系统pkgs参数(推荐)
修改configuration.nix中的导入代码,传入系统配置的pkgs参数,同时修正文件名拼写错误:
environment.systemPackages = [ (import ./modified.nix { pkgs = pkgs; }) ];
这种方式会使用系统配置中的pkgs版本,保持与系统环境一致,灵活性更高。
方法2:调整modified.nix为直接的包表达式
修改modified.nix,去掉函数定义,直接固定使用<nixpkgs>的版本:
let pkgs = import <nixpkgs> { }; repo = pkgs.fetchFromGitHub { owner = "TheCyberArcher"; repo = "Respect-My-Internet"; rev = "feb165acd4d39d61d5c29ad7450b14074f0fb031"; sha256 = "1hcd6dqjxi7jnrnd6n1h792qb6xwmiv855rfykh6rgzlwpgydrzk"; }; in pkgs.opensnitch.overrideAttrs (oldAttrs: { preBuild = '' mkdir -p $out/etc/opensnitchd/rules/ mkdir -p $out/etc/opensnitchd/blocklist cp -r ${repo}/blocklist/respect-my-internet.txt $out/etc/opensnitchd/blocklist/ cp -r ${repo}/blocklist/ip/ $out/etc/opensnitchd/ cp -r ${repo}/regex $out/etc/opensnitchd/ cp -r ${repo}/rules/*.json $out/etc/opensnitchd/rules/ ''; })
此时configuration.nix中的导入代码可保留(import ./modified.nix),但这种方式会固定使用本地<nixpkgs>的版本,无法跟随系统配置的pkgs版本更新。
额外注意
原configuration.nix中写的./modifed.nix存在拼写错误(少了字母i),需修正为./modified.nix,否则会出现文件找不到的错误。
内容的提问来源于stack exchange,提问作者noflcl
相关产品推荐
相关产品推荐

