Как получить путь установленного пакета в nix store?

Вопрос или проблема

Мой пакет установлен с помощью configuration.nix

{ config, pkgs, lib, ... }:
{
  environment.systemPackages = with pkgs; [
    my-package
  ];
}

Как я могу узнать путь к my-package в nix store?

Я ищу что-то столь же простое, как which my_executable, но для пакетов в nix store.

Пример использования

$ my_search my-package [--store /path/to/nix/store]
/path/to/nix/store/qpmg2piws75wmy1619ryh0dhwi9638ni-my_package-1.5.6

Заметки:

  • Он должен предоставить мне путь к генерации и/или деривации, которые используются в настоящее время
  • Не должен требовать подключения к интернету и не должен пытаться что-либо строить. my_package может требовать согласия на определенные лицензии и должен позволять свободные пакеты, которые могут мешать пересборке. Пример: пакет segger-jlink-headless
  • Если пакет был установлен root (например, на NixOS), можно ли использовать команду без прав root? Я всегда могу указать путь /nix/store/, если это необходимо.
  • which my_package_executable не работает, если пакет не содержит исполняемого файла в PATH.

Другие ссылки:

Как найти правильную версию установленного пакета в /nix/store

https://nixos.wiki/wiki/Cheatsheet

Ответ на Discourse кажется устаревшим (не работает для меня): https://discourse.nixos.org/t/how-to-get-a-package-path-in-nix-store-which-not-containing-a-bin-dir/4653/5:

В моем случае nix eval выдает ошибку, когда предоставлен установленный пакет (см. шаг установки выше)

$ nix eval nixpkgs.my-package.outPath
error: getting status of '/home/<user>/nixpkgs.my-package.outPath': No such file or directory

Ответ или решение

Получение пути установленного пакета в хранилище Nix может казаться сложной задачей, но это основополагающий аспект работы с NixOS и Nix package manager. В вашем случае, пакет был установлен через файл configuration.nix, и возникает необходимость найти путь к этому пакету в /nix/store.

Теория

Nix — это мощный инструмент для управления пакетами и системами, который использует уникальный подход к управлению зависимостями и конфигурациями. Код каждого установленного пакета хранится в /nix/store, и путь до этого кода включает в себя хеш, основанный на содержимом и зависимостях пакета. Это гарантирует, что разные версии одного и того же пакета могут сосуществовать на одной системе.

Для определения пути к пакету, установленному в nix store, можно использовать инструменты, предоставляемые самим NixOS. Однако, такой способ, как использование which, здесь неприменим, так как этот инструмент ищет только исполняемые файлы в PATH. О таковых, возможно, в пакете не имеется.

Пример

Рассмотрим несколько путей решения задачи, поставленной в примере.

  1. Использование nix-store: Команда nix-store -q имеет функциональность, которая позволяет запросить путь до установленного пакета. Данная команда может быть использована для показа содержимого ниx стор, связанного с конкретной выходной деривацией:

    nix-store -q --outputs $(nix-instantiate '<nixpkgs>' -A my-package)

    Однако это требует знания атрибута (в данном случае, my-package), и не всегда это сработает, если имя атрибута отличается от имени пакета.

  2. Использование nixos-option: В случае использования NixOS, файл конфигурации системы содержит все пакеты, включённые в системные пакеты. Вы можете попробовать воспользоваться следующим:

    nixos-option environment.systemPackages

    Это выдаст список путей до всех системных пакетов, из чего вы сможете выбрать необходимый. Но если вы уже знаете, как его найти, это может быть избыточным.

  3. Использование nix-env: В общем случае, для пакетов, установленных с помощью nix-env, можно использовать:

    nix-env -q --out-path my-package

    Как видно из примера команды выше, это выдаст путь в nix store до установленного пакета my-package. Однако, важно помнить, что данная команда только работает для пакетов, установленных в пользовательскую среду.

Применение

Для вашего конкретного случая можно использовать команду nix-store с применением nix-instantiate для получения пути к пакету, хотя следует учитывать, что в зависимости от структуры ваших фалых Nix, имя пакета и его атрибут могут не совпадать.

Кроме того, полезно сохранить ясное понимание, что не все пакеты разрабатывались с расчетом на простое извлечение пути через nix-env, так как его работа ограничена пользовательскими установленными пакетами.

Основные моменты для внимания:

  • Убедитесь, что вы передаете корректное имя атрибута, если Nix интуитивно не распознает имя.
  • Проверяйте, есть ли доступ к интернету только если это необходимо, и старайтесь использовать кэшированные и сохраненные ресурсы.
  • Стремитесь использовать команды, не требующие привилегий root, за исключением случаев, когда вы намеренно хотите просмотреть систему целиком.

Это разъясняет важные аспекты поиска путей в nix store и обращает ваше внимание на специфичное использование nix-env и nix-store. Практическое понимание и опыт работы с системой управления пакетами помогут повысить эффективность взаимодействия с NixOS и облегчат решение схожих задач в дальнейшем.

Оцените материал
Добавить комментарий

Капча загружается...