Могу ли я установить какой-либо пакет (используя Nix), который недоступен в репозитории Nix, но доступен в виде файла deb или rpm или в качестве источника (tar.gz)? Каков метод для этого? Можно ли это сделать только на NixOS или в Nix, установленном в других дистрибутивах Linux? Спасибо за понимание.Установка извне Репозиторий Nix
ответ
Менеджер пакетов Nix - это программа для управления программным обеспечением. Для этого, как и для всех менеджеров пакетов, это программное обеспечение должно быть упаковано в подходящий формат.
Nix только понимает Nix выражения, который он использует для сборки и установки программного обеспечения. Существуют некоторые методы преобразования (например, для пакетов cabal), но для большинства программ необходимо иметь соответствующее выражение Nix, чтобы иметь возможность использовать его с Nix.
При этом часто можно распаковать пакеты (например, .deb
) у других менеджеров пакетов. Так как большинство других менеджеров пакетов следовать Filesystem Hierarchy Standard (FHS) есть способ, чтобы использовать их с Никс так или иначе:
Используя функцию buildFHSUserEnv
можно создать FHS environment, содержащий несколько пакетов Nix. Для того, чтобы иметь возможность использовать .deb
пакеты программного обеспечения с Никса, один должен, таким образом:
- Создать выражение Nix, чтобы распаковать файл
.deb
. Результатом этого выражения является пакет Nix с программным обеспечением, который не работает, потому что содержащееся программное обеспечение будет искать в каталогах FHS для его зависимостей. - Создайте среду FHS и загрузите в нее ранее созданный пакет, а также все зависимости.
Это не тривиальная процедура, а объяснение в некоторой степени here.
В большинстве случаев это намного проще - если у вас есть доступ к исходному коду программного обеспечения - для создания нормального «родного» пакета Nix, который соответствующим образом создает программное обеспечение. Создание пакета для стандартного процесса сборки ./configure
, make
, make install
тривиальна:
{ stdenv, fetchurl, autoconf }: # Add other dependencies here, as parameters to the function
stdenv.mkDerivation {
name = "FOO-1.42b"; # name of the package
src = fetchurl { # there's also fetchgit and other helpers
url = mirror://sourceforge/FOO/FOO-1.42b-src.tar.gz;
sha256 = "07iwv4j4d2n7f7iffv2xfi1lyp4vr0m9qw40pidw15h1jczxgps9";
};
meta = {
homepage = http://foo.bar;
description = "bar foo bar foo";
license = stdenv.lib.licenses.bsd3; # adjust
platforms = stdenv.lib.platforms.all;
};
buildInputs = [ autoconf ]; # just as example, autoconf needed if ...
preConfigure = "make -f Makefile.aux prepare"; # ... this step of the build hasn't been done upstream yet
# configureFlags, preBuild, installTargets , ... only if non standard build
}
Некоторые документы об этом можно найти в nixpkgs manual.
Более поздний метод работает независимо от того, используется ли Nix самостоятельно или в пределах NixOS. Для первого вы можете получить проблемы, если не можете использовать пространства имен Linux в базовой системе.