如何为包编写新的 .nix 配置文件?

How to write a new .nix config file for packages?

我想在 configuration.nix 的单独 .nix 文件中包含已安装软件包的列表。我按照手册想出了这个:

{ config, pkgs }:

{
  environment.systemPackages = [
    pkgs.firefox
  ];
}

尝试编译时出现错误:

[root@nixos:/dev/disk]# nixos-rebuild build
building Nix...
error: anonymous function at /etc/nixos/packages.nix:1:1 called with unexpected argument 'options', at /nix/var/nix/profiles/per-user/root/channels/nixos/lib/modules.nix:170:8
(use '--show-trace' to show detailed location information)
building the system configuration...
error: anonymous function at /etc/nixos/packages.nix:1:1 called with unexpected argument 'options', at /nix/var/nix/profiles/per-user/root/channels/nixos/lib/modules.nix:170:8
(use '--show-trace' to show detailed location information)

从错误来看,参数列表中似乎缺少 ...,所以这应该有效:

{ config, pkgs, ... }:

{
  environment.systemPackages = [
    pkgs.firefox
  ];
}

(尝试进行更详细的解释:)

你的packages.nix是一个函数,configpkgs是它的一些参数。不过还有更多,快速尝试一下我得到了 config, pkgs, lib, options, modulesPath 作为完整的参数列表。

你的 /etc/nixos/configuration.nix 只是众多 NixOS 模块中的一个,它是使用 lib.evalModules 中 NixOS 模块的机制进行评估的(在 <nixpkgs/lib/modules.nix>). It is a bit special (but only a bit), and it is not evaluated directly but through <nixpkgs/nixos/lib/eval-config.nix>, which is the entrypoint to evaluating the entire NixOS configuration (also used in NixOps and when creating installation media for NixOS). You can read more about NixOS modules in the manual in the chapter "Writing NixOS Modules" 中定义,尽管这确实没有必要对于仅使用 NixOS。在深入研究 NixOS 模块的源代码之前滚动浏览它可能会很好,但我学得太晚了。