Установка из внешнего репозитория Nix

Могу ли я установить пакет (используя Nix), который недоступен в репозитории Nix, но доступен как файл deb, rpm или как исходный код (tar.gz)? Как это сделать? Можно ли это сделать только в NixOS или в Nix, установленном и в других дистрибутивах Linux? Спасибо за понимание.


person rnso    schedule 23.11.2015    source источник


Ответы (1)


Менеджер пакетов Nix - это программа для управления программным обеспечением. Для этого, как и все менеджеры пакетов, это программное обеспечение необходимо упаковать в подходящий формат.

Nix понимает только выражения Nix, которые он использует для сборки и установки программного обеспечения. Есть несколько методов преобразования (например, для пакетов Cabal), но для большинства программ необходимо иметь соответствующее выражение Nix, чтобы его можно было использовать с Nix.

Тем не менее, часто можно распаковать пакеты (например, .deb) из других менеджеров пакетов. Поскольку большинство других менеджеров пакетов следуют Стандарту иерархии файловой системы (FHS), существует способ использовать их с Nix в любом случае:

Используя функцию buildFHSUserEnv, можно создать среду FHS, содержащую некоторые пакеты Nix. Таким образом, чтобы иметь возможность использовать .deb упакованное программное обеспечение с Nix:

  1. Создайте выражение Nix для распаковки файла .deb. Результатом этого выражения является пакет Nix с программным обеспечением, которое не работает, потому что содержащееся в нем программное обеспечение будет искать в каталогах FHS свои зависимости.
  2. Создайте среду 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 в базовой системе.

person Daniel Jour    schedule 25.11.2015