nix-index — это инструмент для быстрого поиска пакета, содержащего определенный файл в nixpkgs
. Он индексирует встроенные производные, найденные в двоичных кэшах.
$ 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
создайте базу данных:
$ nix run github:nix-community/nix-index#nix-index
запрос файла:
$ nix run github:nix-community/nix-index#nix-locate -- bin/hello
Чтобы установить последнюю разрабатываемую версию nix-index, просто клонируйте репозиторий и запустите nix-env -if.
:
$ git clone https://github.com/nix-community/nix-index
$ cd nix-index
$ nix-env -if.
Для стабильной версии вы можете либо получить последний тег (см. список здесь), либо использовать репозитории Nixpkgs и установить его с помощью:
$ nix-env -iA nixos.nix-index
Во-первых, вам нужно сгенерировать индекс, запустив nix-index
(это занимает около 5 минут). Затем вы можете использовать nix-locate pattern
. Для получения дополнительной информации см. nix-locate --help
и nix-index --help
.
nix-index-database предоставляет предварительно сгенерированные базы данных, если вы не хотите создавать базу данных локально. Он также поставляется с модулями nixos/home-manager для использования этих баз данных.
Nix-index предоставляет сценарий «команда не найдена», который может распечатать для вас путь к атрибутам ненайденных команд в вашей оболочке. Вы можете либо использовать ${pkgs.nix-index}/etc/command-not-found.sh
в своих собственных файлах инициализации оболочки (насколько нам известно, работает для ZSH и Bash), либо вы можете использовать следующее в домашних условиях: менеджер /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
'' ;
Замените bash
на zsh
если вы используете zsh
.
Пример вывода:
$ 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 ...
Теперь доступен модуль home-manager
для интеграции nix-index
с bash
, zsh
и fish
с помощью этого скрипта.
Если вы обнаружите какие-либо недостающие функции, которые хотели бы реализовать, я буду очень рад любым пиарам! Вы также можете сначала создать проблему, если функция более сложная, чтобы мы могли обсудить возможные реализации.
Вот краткое описание всех соответствующих файлов:
bin/{nix-index, nix-locate}.rs
: реализация инструментов командной строки nix-index/nix-locate.src/database.rs
: функции высокого уровня для работы с форматом базы данных.src/files.rs
: типы данных для работы со списками файлов.src/frcode.rs
: низкоуровневая реализация кодировщика для эффективного хранения множества путей к файлам (более подробную информацию см. в комментариях к файлу). Используется database.rs
.src/hydra.rs
: занимается всем, что связано с загрузкой из двоичного кэша (получением списков файлов и ссылок).src/nixpkgs.rs
: реализует сбор пакетов (пути к хранилищу и атрибуты) с использованием nix-env
src/package.rs
: типы данных высокого уровня для представления путей к хранилищу (иногда также называемые пакетом).src/workset.rs
: очередь, используемая nix-index
для реализации рекурсивной выборки (извлечения всех ссылок)