是否有一个命令可用于确定 NixOS 中系统范围内安装了哪些软件包?
例如,我可以使用 列出为当前用户安装的软件包nix-env -q
。我不知道有什么方法可以列出整个系统上安装的软件包/etx/nixos/configuration.nix
。
我想在两个单独的实例中使用它:
假设我向
/etc/nixos/configuration.nix
in添加了一个包environment.systemPackages
,但我忘记了是否已经运行过nixos-rebuild switch
。如果有一个命令可以运行来检查该包是否在系统环境中,那就太好了。我已经
programs.bash.enableCompletion
设置为true
in/etc/nixos/configuration.nix
.不看选项尼克斯包装,我猜这个选项会设置bash-completion
要安装的包。如果有一个我可以运行的命令来检查该bash-completion
包是否确实在系统环境中,那就太好了。
答案1
没有专门的工具可以做到这一点。您可能喜欢这个system.copySystemConfiguration
选项(请参阅文档中的“注意事项”)。
您将相对接近nix-store -q --references /run/current-system/sw
– 直接包含在 中的 nix 存储路径列表systemPackages
,但请注意,各种 NixOS 选项可能会在其中添加包。
答案2
由于 NixOS 安装软件的方法,不存在已安装的软件包之类的东西全系统。也就是说,与大多数包管理器的意义不同。
但是,如果您将用户环境(又名配置文件)视为等同于全系统,然后您可以使用nix-store -q -R /nix/var/nix/profiles/system-${n}-link
列出给定用户环境的依赖项;其中${n}
是配置文件的代号。我所说的依赖关系是指直接依赖关系和间接依赖关系。
此外,如果您使用--tree
rather of-R
参数,您可以获得一个ASCII 依赖树。
答案3
对于您的第一个用例,您可以使用:
nixos-rebuild dry-build
此命令显示将构建和下载的内容。如果您想知道是否有应该构建的新包,您可以使用上面的命令。
请注意,这不会告诉您有关已构建但当前未激活的软件包的信息。前任。如果您将 firefox 添加到您的configuration.nix
、重建、删除 firefox、重建、添加 firefox 然后运行上面的内容,它不会显示任何内容,因为没有任何新内容需要构建。 Nix 保留旧包直到垃圾收集。
还有nixos-rebuild dry-activate
一种构建新系统但不做任何更改。它将显示其他更改,例如您禁用/启用某些服务。