Могу ли я установить пакет (используя Nix), который недоступен в репозитории Nix, но доступен как файл deb, rpm или как исходный код (tar.gz)? Как это сделать? Можно ли это сделать только в NixOS или в Nix, установленном и в других дистрибутивах Linux? Спасибо за понимание.
Установка из внешнего репозитория Nix
Ответы (1)
Менеджер пакетов Nix - это программа для управления программным обеспечением. Для этого, как и все менеджеры пакетов, это программное обеспечение необходимо упаковать в подходящий формат.
Nix понимает только выражения Nix, которые он использует для сборки и установки программного обеспечения. Есть несколько методов преобразования (например, для пакетов Cabal), но для большинства программ необходимо иметь соответствующее выражение Nix, чтобы его можно было использовать с Nix.
Тем не менее, часто можно распаковать пакеты (например, .deb
) из других менеджеров пакетов. Поскольку большинство других менеджеров пакетов следуют Стандарту иерархии файловой системы (FHS), существует способ использовать их с Nix в любом случае:
Используя функцию buildFHSUserEnv
, можно создать среду FHS, содержащую некоторые пакеты Nix. Таким образом, чтобы иметь возможность использовать .deb
упакованное программное обеспечение с Nix:
- Создайте выражение Nix для распаковки файла
.deb
. Результатом этого выражения является пакет Nix с программным обеспечением, которое не работает, потому что содержащееся в нем программное обеспечение будет искать в каталогах FHS свои зависимости. - Создайте среду FHS и загрузите в нее ранее собранный пакет, а также все зависимости.
Это нетривиальная процедура, но она подробно описана здесь а>.
В большинстве случаев гораздо проще - если у кого-то есть доступ к исходному коду программного обеспечения - создать нормальный, «родной» пакет 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.
Более поздний метод работает независимо от того, используется ли Nix отдельно или в NixOS. В первом случае у вас могут возникнуть проблемы, если вы не можете использовать пространства имен Linux в базовой системе.