Ответ 1
-
Зависимости времени выполнения являются подмножеством зависимостей времени сборки, которые Nix определяет автоматически, сканируя сгенерированный вывод для хеш-части каждого пути хранения хранилищ времени сборки. Например, если вы создаете пакет с помощью компилятора
/nix/store/abcdef...-foo-1.20
, то Nix будет сканировать все файлы в сгенерированном выходе для хэш-битabcdef...
. Если этот хеш найден, то предполагается, что вывод ссылается на компилятор каким-то образом, поэтому он сохраняет зависимость от времени выполнения. Однако, если этот хэш не возникает, то сгенерированный вывод не имеет никакого отношения к компилятору и поэтому не может получить к нему доступ во время выполнения, поэтомуfoo-1.20
рассматривается как зависимость от времени сборки. -
Некоторые пакеты записывают большие части своей среды сборки для информационных/отладочных целей. Например, Perl хранит каждую небольшую деталь о инструментах, используемых для ее компиляции, поэтому все эти пути хранилища обрабатываются как зависящие от времени выполнения зависимости, несмотря на то, что Perl на самом деле не нуждается в них во время выполнения, но Nix не может знать: он просто знает, что путь к хранилищу Perl ссылается на эти инструменты. Теперь поддерживающие Nixpkgs обычно стараются очистить это, то есть путем обрезки файла журнала, который содержит все эти пути хранилища от установки, и т.д., Но, наверняка, в базе данных еще много пакетов, которые еще не были оптимизированы для этот конец еще.
-
Предположим, что вы хотите скомпилировать версию
openssh
, которая не зависит от PAM. Затем вы можете удалить вход сборки из выражения с помощью переопределения, т.е. Вы замените аргументpam
, который обычно передается функции сборкиopenssh
с помощьюnull
. Для этого сохраните следующий файл в~/.nixpkgs/config.nix
{ packageOverrides = super: let self = super.pkgs; in { openssh-without-pam = super.openssh.override { pam = null; }; }; }
и теперь установите этот пакет, выполнив:
$ nix-env -f "<nixpkgs>" -iA openssh-without-pam