如何在 Nixpkgs 中搜索包表达式?

zuz*_*nen 2 nix

从手册中:

组件是通过一组 Nix 表达式安装的,这些表达式告诉 Nix 如何构建这些包,包括(如果需要)它们的依赖项。有一个名为 Nixpkgs 包集合的 Nix 表达式集合,其中包含从 GCC 和 Glibc 等基本开发内容到 Mozilla Firefox 等最终用户应用程序的包。

例如,假设我想搜索 Go 包的 nix 表达式。我应该在存储库中哪里查找才能找到正确的文件?

Rob*_*ing 6

我选择的工具是nix repl. 通常,它的制表符补全足以查找属性名称。有时您可能想使用https://search.nixos.org/packages

为了方便的工作流程,您EDITOR可以:editnix repl. 通常我在 VSCode 中打开 nixpkgs,然后nix repl .在 VSCode 终端中运行,这样我也可以按住 Ctrl 键并单击文件位置。

我从不使用目录结构,因为搜索方便得多。

[~/nixpkgs]$ export EDITOR=...  # nano doesn't seem to work for this
[~/nixpkgs]$ nix repl .

nix-repl> :edit go
Run Code Online (Sandbox Code Playgroud)

或者

nix-repl> go.meta.position
"~/nixpkgs/pkgs/development/compilers/go/1.17.nix:278"
Run Code Online (Sandbox Code Playgroud)

这通常会为您提供调用的位置mkDerivation或对类似函数的调用。

要获取定义属性的位置,请使用

nix-repl> builtins.unsafeGetAttrPos "go" pkgs
{ column = 3; file = "~/nixpkgs/pkgs/top-level/all-packages.nix"; line = 12753; }
Run Code Online (Sandbox Code Playgroud)

然后是递归目录搜索选项(如grep -RIDE 集成搜索等)。这通常非常有效,因为包名称往往很具体。可惜go不是。go我们通常不会在 Nix 中进行疯狂的代码格式化,如果您忽略 中的定义,前导空格和等号可以很好地查找定义,即使对于 也是如此lib/

[~/nixpkgs]$ git grep -n ' go ='
lib/attrsets.nix:125:    go = prefixLength: hasValue: value: updates:
lib/debug.nix:234:      go = x: generators.toPretty
lib/deprecated.nix:92:    let go = xs: acc:
lib/filesystem.nix:29:    let go = path:
lib/generators.nix:237:    go = indent: v: with builtins;
lib/trivial.nix:500:      go = i:
nixos/modules/security/apparmor/includes.nix:9:    let go = { path ? null, mode ? "r", trail ? "" }:
pkgs/stdenv/booter.nix:63:      go = pred: n:
pkgs/top-level/all-packages.nix:12753:  go = go_1_17;
pkgs/top-level/all-packages.nix:21043:    go = buildPackages.go_1_16;
pkgs/top-level/all-packages.nix:21046:    go = buildPackages.go_1_17;
pkgs/top-level/all-packages.nix:21049:    go = buildPackages.go_1_18;
pkgs/top-level/all-packages.nix:21055:    go = buildPackages.go_1_16;
pkgs/top-level/all-packages.nix:21058:    go = buildPackages.go_1_17;
pkgs/top-level/all-packages.nix:21061:    go = buildPackages.go_1_18;
pkgs/top-level/all-packages.nix:26493:    go = go_1_16;
Run Code Online (Sandbox Code Playgroud)