Вопрос или проблема
Мой пакет установлен с помощью 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
. О таковых, возможно, в пакете не имеется.
Пример
Рассмотрим несколько путей решения задачи, поставленной в примере.
-
Использование
nix-store
: Командаnix-store -q
имеет функциональность, которая позволяет запросить путь до установленного пакета. Данная команда может быть использована для показа содержимого ниx стор, связанного с конкретной выходной деривацией:nix-store -q --outputs $(nix-instantiate '<nixpkgs>' -A my-package)
Однако это требует знания атрибута (в данном случае,
my-package
), и не всегда это сработает, если имя атрибута отличается от имени пакета. -
Использование
nixos-option
: В случае использования NixOS, файл конфигурации системы содержит все пакеты, включённые в системные пакеты. Вы можете попробовать воспользоваться следующим:nixos-option environment.systemPackages
Это выдаст список путей до всех системных пакетов, из чего вы сможете выбрать необходимый. Но если вы уже знаете, как его найти, это может быть избыточным.
-
Использование
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 и облегчат решение схожих задач в дальнейшем.