Построение зависимости от заработка в Nix

Я только начинаю разбираться с Nix, поэтому извиняюсь, если я пропустил ответ на свой вопрос в документах.

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

Когда я устанавливаю некоторые пакеты, кажется, что они зависят только от минимального набора зависимостей времени выполнения. Например, если я устанавливаю apache-tomcat-8.0.23, тогда я получаю Java runtime (JRE) и готовые JAR файлы, содержащие Tomcat.

С другой стороны, некоторые пакеты, как представляется, включают в себя полную цепочку построения в качестве зависимостей. Взяв другой пример на основе Java, когда я устанавливаю spark-1.4.0 Nix вытаскивает набор разработчика Java (JDK), который включает компилятор, а также вытаскивает инструмент сборки Maven и т.д.

Итак, мои вопросы таковы:

  • Делают ли пакеты Nix какое-либо различие между зависимостями между строкой и временем выполнения?
  • Почему некоторые пакеты зависят от инструментов сборки, тогда как другим требуется только время выполнения? Все дело в том, как автор пакета завершил приложение?
  • Если пакет содержит зависимостей сборки, которые я не хочу, есть ли что-то, что я, как оператор, могу сделать с этим, кроме разработки моей собственной альтернативной упаковки для того же приложения?

Большое спасибо.

Ответ 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