NixOS - 环境.systemPackages 是如何实现的

NixOS - 环境.systemPackages 是如何实现的

我已经开始使用 NixOS。据我了解,Nix 是一种专门构建的函数式语言,旨在避免副作用。所有包都是一个巨大属性集的一部分,但由于所有内容都是惰性评估的,所以没有问题。通过访问一个成员,您基本上“让某件事发生”,但即使这样,“派生”也只是一个值,您还需要显式地“构建”它。

我想知道environment.systemPackages到底是如何实现的以及在哪里可以找到它的来源? (我尝试通过 nixpkgs 进行搜索,但误报太多。)。

我只是想了解整个过程,甚至可能破解一个配置文件,以便本地用户可以拥有一个以声明方式管理的已安装软件包列表(类似于所有的 systemPackages),而不是使用(自动)运行的命令式方式nix-env -i。我已经看过 ~/.config/nixpkgs/config.nix示例并且能够实现 packageOverrides 函数。但是这样我就能够创建某种新的元包“包括”其他元包(仍然不会自动安装任何内容)还是我错了?我听说过一种叫做叠加的东西 - 这个概念如何融入图片中?

答案1

users.users.<名称?>.packages就是我一直在寻找的。

我将尝试重新表述我的问题的第二部分(这使得它非常混乱,对此感到抱歉)

假设我有类似的东西:

blah = [ pkgs.hello ];

有没有函数 f 可以让我做:

f blah

这将使 hello 包出现在系统上。

现在我意识到这有点矛盾,因为如果有的话,尼克斯也并非没有副作用。所以我认为 Chris Stryczynski 是对的,有一些外部工具可以用于环境.systemPackages是一件事但是废话不是。不过我可能可以将 f 实现为

environment.systemPackages ++ blah

或其他东西(将代码示例视为伪代码,而不是语法上正确的 Nix)。

答案2

就如何实现而言environment.systemPackages,我假设该值将从各种脚本(如 nixos-install、nixos-rebuild 等)中检索,这些脚本可以在此处找到: https://github.com/NixOS/nixpkgs/tree/master/nixos/modules/installer/tools

但它似乎只是一个列表(用 Nix 语言)。

亲自查看过它们后,首先了解 Nix 的工作原理,然后了解 Nixos 的相关功能可能会有所帮助。

相关内容