2015-11-23 9 views
2

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

ответ

4

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

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

При этом часто можно распаковать пакеты (например, .deb) у других менеджеров пакетов. Так как большинство других менеджеров пакетов следовать Filesystem Hierarchy Standard (FHS) есть способ, чтобы использовать их с Никс так или иначе:

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

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