Как выдать сообщение перед сборкой - или последующие проблемы - PullRequest
0 голосов
/ 18 октября 2019

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

Моя идея интерфейса заключается в предоставлении функции build-with-message, которая будет вызываться с чем-то вроде этого:

build-with-message 
 ''Building ${pkg.name}. Alternative invocations are: ..''
  pkg

Моя реализация основана на builtins.seq

build-with-message = msg : pkg :
  seq 
    (self.runCommand "issue-message" {} ''mkdir $out; echo ${msg}'')
     pkg;

Когда я собираю пакет с build-with-message, я никогда не вижу сообщения. Я догадываюсь, что seq оценивает runCommand достаточно далеко, чтобы увидеть, что набор возвращается и переходит к построению пакета. Я тоже пытался с deepSeq, но сборка deepSeq не удалась на runCommand. Я также попытался вызвать некоторые атрибуты из runCommand, например

(self.runCommand "issue-message" {} ''mkdir $out; echo ${msg}'').drvPath
(self.runCommand "issue-message" {} ''mkdir $out; echo ${msg}'').out

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

Итак:

  • Есть ли способ заставить runCommand построить по вышеуказанному сценарию?
  • Уже есть какая-то встроенная функция, которая позволяет мне выдавать сообщения поверх произвольных сборок?

1 Ответ

0 голосов
/ 21 октября 2019

Вот я снова отвечаю на свой вопрос, считаю это предупреждением.

Решение:

Я добавил несколько пронумерованных комментариев, чтобы помочь с объяснением.

  build-with-message = msg : pkg :
    let runMsg /*1*/ = self.runCommand "issue-message"
                       { version = toString currentTime; /*2*/ } ''
            cat <<EOF
            ${msg}
            EOF
            echo 0 > $out /*3*/
            '';
    in seq (import runMsg /*4*/) pkg; /*5*/

Объяснение:

  1. runMsg является производной, которая выдает сообщение.
  2. Добавление version на основе текущего времени гарантирует, что сборка runMsg не будет в /nix/store. В противном случае каждое уникальное сообщение будет выдано только для первой сборки.
  3. После того, как сообщение напечатано, 0 сохраняется в файл в качестве вывода деривации.
  4. Импорт загружаетсяrunMsg - деривация, и поэтому сериализуется как путь $out. В импорте ожидается выражение nix, в данном случае это просто число 0 (допустимое выражение nix).
  5. Теперь, поскольку вывод runMsg будет недоступен до тех пор, пока он не будет построен, команда seq создаст его (отправив сообщение), а затем соберет pkg.
...