nix-index ist ein Tool zum schnellen Auffinden des Pakets, das eine bestimmte Datei in nixpkgs
bereitstellt. Es indiziert erstellte Ableitungen, die in binären Caches gefunden werden.
$ nix-locate 'bin/hello'
hello.out 29,488 x /nix/store/bdjyhh70npndlq3rzmggh4f2dzdsj4xy-hello-2.10/bin/hello
linuxPackages_4_4.dpdk.examples 2,022,224 x /nix/store/jlnk3d38zsk0bp02rp9skpqk4vjfijnn-dpdk-16.07.2-4.4.52-examples/bin/helloworld
linuxPackages.dpdk.examples 2,022,224 x /nix/store/rzx4k0pb58gd1dr9kzwam3vk9r8bfyv1-dpdk-16.07.2-4.9.13-examples/bin/helloworld
linuxPackages_4_10.dpdk.examples 2,022,224 x /nix/store/wya1b0910qidfc9v3i6r9rnbnc9ykkwq-dpdk-16.07.2-4.10.1-examples/bin/helloworld
linuxPackages_grsec_nixos.dpdk.examples 2,022,224 x /nix/store/2wqv94290pa38aclld7sc548a7hnz35k-dpdk-16.07.2-4.9.13-examples/bin/helloworld
camlistore.out 7,938,952 x /nix/store/xn5ivjdyslxldhm5cb4x0lfz48zf21rl-camlistore-0.9/bin/hello
Erstellen Sie die Datenbank:
$ nix run github:nix-community/nix-index#nix-index
Abfrage nach einer Datei:
$ nix run github:nix-community/nix-index#nix-locate -- bin/hello
Um die neueste Entwicklungsversion von nix-index zu installieren, klonen Sie einfach das Repo und führen Sie nix-env -if.
:
$ git clone https://github.com/nix-community/nix-index
$ cd nix-index
$ nix-env -if.
Für die stabile Version können Sie entweder das neueste Tag auschecken (siehe Liste hier) oder die Repositorys von Nixpkgs verwenden und es installieren mit:
$ nix-env -iA nixos.nix-index
Zuerst müssen Sie einen Index generieren, indem Sie nix-index
ausführen (dies dauert etwa 5 Minuten). Dann können Sie nix-locate pattern
verwenden. Weitere Informationen finden Sie nix-locate --help
und nix-index --help
.
nix-index-database bietet vorgenerierte Datenbanken, wenn Sie keine Datenbank lokal generieren möchten. Es enthält außerdem Nixos/Home-Manager-Module zur Nutzung dieser Datenbanken.
Nix-index bietet ein „Befehl-nicht-gefunden“-Skript, das den Attributpfad nicht gefundener Befehle in Ihrer Shell für Sie ausdrucken kann. Sie können ${pkgs.nix-index}/etc/command-not-found.sh
entweder in Ihren eigenen Shell-Init-Dateien als Quelle verwenden (funktioniert, soweit wir wissen, für ZSH und Bash), oder Sie können zu Hause Folgendes verwenden: manager / /etc/nixos/configuration.nix
:
programs . command-not-found . enable = false ;
# for home-manager, use programs.bash.initExtra instead
programs . bash . interactiveShellInit = ''
source ${ pkgs . nix-index } /etc/profile.d/command-not-found.sh
'' ;
Ersetzen Sie bash
durch zsh
, wenn Sie zsh
verwenden.
Beispielausgabe:
$ blender
The program 'blender' is currently not installed. You can install it
by typing:
nix-env -iA nixpkgs.blender.out
Or run it once with:
nix-shell -p blender.out --run ...
Ein home-manager
Modul ist jetzt verfügbar, um nix-index
mit bash
, zsh
und fish
mithilfe dieses Skripts zu integrieren.
Wenn Sie fehlende Funktionen finden, die Sie gerne implementieren würden, freue ich mich sehr über jede PR! Sie können auch zuerst ein Problem erstellen, wenn die Funktion komplexer ist, damit wir mögliche Implementierungen besprechen können.
Hier finden Sie eine kurze Beschreibung aller relevanten Dateien:
bin/{nix-index, nix-locate}.rs
: Implementierung der Befehlszeilentools nix-index / nix-locatesrc/database.rs
: High-Level-Funktionen für die Arbeit mit dem Datenbankformatsrc/files.rs
: Die Datentypen für die Arbeit mit Dateilistensrc/frcode.rs
: Low-Level-Implementierung eines Encoders zum effizienten Speichern vieler Dateipfade (weitere Details finden Sie in den Kommentaren in der Datei). Wird von database.rs
verwendet.src/hydra.rs
: Behandelt alles, was mit dem Herunterladen aus dem Binärcache zu tun hat (Abrufen von Dateilisten und Referenzen).src/nixpkgs.rs
: Implementiert das Sammeln der Pakete (Speicherpfade und Attribute) mithilfe von nix-env
src/package.rs
: High-Level-Datentypen zur Darstellung von Speicherpfaden (manchmal auch als Paket bezeichnet)src/workset.rs
: Eine Warteschlange, die von nix-index
verwendet wird, um das rekursive Abrufen (Abrufen von Referenzen von allem) zu implementieren.