You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 13:10:18