nix-index é uma ferramenta para localizar rapidamente o pacote que fornece um determinado arquivo em nixpkgs
. Ele indexa derivações construídas encontradas em caches binários.
$ 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
crie o banco de dados:
$ nix run github:nix-community/nix-index#nix-index
consultar um arquivo:
$ nix run github:nix-community/nix-index#nix-locate -- bin/hello
Para instalar a versão de desenvolvimento mais recente do nix-index, basta clonar o repositório e executar nix-env -if.
:
$ git clone https://github.com/nix-community/nix-index
$ cd nix-index
$ nix-env -if.
Para a versão estável, você pode verificar a tag mais recente (veja a lista aqui) ou usar os repositórios do Nixpkgs e instalá-la com:
$ nix-env -iA nixos.nix-index
Primeiro, você precisa gerar um índice executando nix-index
(leva cerca de 5 minutos). Então, você pode usar nix-locate pattern
. Para obter mais informações, consulte nix-locate --help
e nix-index --help
.
nix-index-database fornece bancos de dados pré-gerados se você não quiser gerar um banco de dados localmente. Ele também vem com módulos nixos/home-manager para usar esses bancos de dados.
Nix-index fornece um script de "comando não encontrado" que pode imprimir para você o caminho do atributo de comandos não encontrados em seu shell. Você pode obter ${pkgs.nix-index}/etc/command-not-found.sh
em seus próprios arquivos init do shell (funciona para ZSH e Bash até onde sabemos) ou pode usar o seguinte em casa- gerenciador / /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
'' ;
Substitua bash
por zsh
se você usar zsh
.
Exemplo de saída:
$ 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 ...
Um módulo home-manager
agora está disponível para integrar nix-index
com bash
, zsh
e fish
usando este script.
Se você encontrar algum recurso ausente que gostaria de implementar, ficarei muito feliz com qualquer PR! Você também pode criar um problema primeiro se o recurso for mais complexo, para que possamos discutir possíveis implementações.
Aqui está uma descrição rápida de todos os arquivos relevantes:
bin/{nix-index, nix-locate}.rs
: Implementação das ferramentas de linha de comando nix-index / nix-locatesrc/database.rs
: Funções de alto nível para trabalhar com o formato do banco de dadossrc/files.rs
: os tipos de dados para trabalhar com listagens de arquivossrc/frcode.rs
: Implementação de baixo nível de um codificador para armazenar com eficiência muitos caminhos de arquivo (veja os comentários no arquivo para mais detalhes). Usado por database.rs
.src/hydra.rs
: Lida com tudo o que tem a ver com download do cache binário (busca de listagens e referências de arquivos)src/nixpkgs.rs
: Implementa a coleta de pacotes (armazenar caminhos e atributos) usando nix-env
src/package.rs
: tipos de dados de alto nível para representar caminhos de armazenamento (às vezes também chamados de pacote)src/workset.rs
: Uma fila usada pelo nix-index
para implementar a busca recursiva (busca de referências de tudo)