我已经开始使用 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 的相关功能可能会有所帮助。