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

Rya*_*yan 4 config nixos nix

我想将我的已安装软件包列表放在一个单独的 .nix 文件中,来自 configuration.nix。我按照手册并提出了这个:

{ config, pkgs }:

{
  environment.systemPackages = [
    pkgs.firefox
  ];
}
Run Code Online (Sandbox Code Playgroud)

尝试编译它给了我一个错误:

[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)
Run Code Online (Sandbox Code Playgroud)

sna*_*ter 5

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

{ config, pkgs, ... }:

{
  environment.systemPackages = [
    pkgs.firefox
  ];
}
Run Code Online (Sandbox Code Playgroud)

(尝试更详细的解释如下:)

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

/etc/nixos/configuration.nix只是众多 NixOS 模块中的一个,它使用中的 NixOS 模块机制进行评估lib.evalModules(在中定义<nixpkgs/lib/modules.nix>)。它有点特殊(但只是一点点),它不是直接评估,而是通过<nixpkgs/nixos/lib/eval-config.nix>,这是评估整个 NixOS 配置的入口点(也在 NixOps 和为 NixOS 创建安装媒体时使用)。您可以在“编写 NixOS 模块”一章的手册中阅读有关 NixOS 模块的更多信息,尽管这对于仅使用 NixOS 来说并不是必需的。不过,在深入研究 NixOS 模块的源代码之前滚动浏览它可能会很好,但我学到的东西太晚了。

  • 感谢您的出色回答。我还发现通过将上面的行更改为 `environment.systemPackages = with pkgs;,我可以避免为我安装的每个程序键入 `pkgs.`。[` (2认同)