Nix:nixpkgs 和 nixpkgs.pkgs 之间的具体区别是什么?
Nix: what's the concrete difference between nixpkgs and nixpkgs.pkgs?
在:
n = import <nixpkgs> {};
n
包含一个属性 n.pkgs
,它似乎也包含所有可用的包。那么n
和n.pkgs
有什么区别呢?
这似乎与 Nix 配置的固定点语义以及覆盖 nixpkgs 中某些包的可用性有关,但我无法真正理解它并找到明确的区别。
import <nixpkgs> {}
为您提供 Nixpkgs 的原始实例,即没有应用任何用户配置。
(import <nixpkgs> {}).pkgs
为您提供了一个 Nixpkgs 版本,该版本具有用户配置的设置并应用了 ~/.nixpkgs/config.nix
的覆盖。
它们之间没有区别。如果你把这个放在你的 ~/.config/nixpkgs/config.nix
:
{
packageOverrides = self: { newAttr = "testing testing"; };
}
...您会看到这两个命令具有相同的输出:
$ nix-instantiate --eval -E 'with import <nixpkgs> {}; newAttr'
"testing testing"
$ nix-instantiate --eval -E 'with import <nixpkgs> {}; pkgs.newAttr'
"testing testing"
对于 Nix 2.1.3 和 Nix 1.11.16 都是如此。
nixpkgs 中 pkgs
别名的目的是 callPackage
可以为需要它的 nix 函数填写 pkgs
参数。
在:
n = import <nixpkgs> {};
n
包含一个属性 n.pkgs
,它似乎也包含所有可用的包。那么n
和n.pkgs
有什么区别呢?
这似乎与 Nix 配置的固定点语义以及覆盖 nixpkgs 中某些包的可用性有关,但我无法真正理解它并找到明确的区别。
import <nixpkgs> {}
为您提供 Nixpkgs 的原始实例,即没有应用任何用户配置。
(import <nixpkgs> {}).pkgs
为您提供了一个 Nixpkgs 版本,该版本具有用户配置的设置并应用了 ~/.nixpkgs/config.nix
的覆盖。
它们之间没有区别。如果你把这个放在你的 ~/.config/nixpkgs/config.nix
:
{
packageOverrides = self: { newAttr = "testing testing"; };
}
...您会看到这两个命令具有相同的输出:
$ nix-instantiate --eval -E 'with import <nixpkgs> {}; newAttr'
"testing testing"
$ nix-instantiate --eval -E 'with import <nixpkgs> {}; pkgs.newAttr'
"testing testing"
对于 Nix 2.1.3 和 Nix 1.11.16 都是如此。
nixpkgs 中 pkgs
别名的目的是 callPackage
可以为需要它的 nix 函数填写 pkgs
参数。