openlang

tryEval пропустил нарочно сломанный пакет

Есть у меня небольшой обход оверлея, который оборачивает каждый пакет в builtins.tryEval и перечисляет упавшие. Он сообщил, что всё в порядке, включая пакет, нарочно сломанный через throw в списке зависимостей.

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

let
  pkg = { name = "demo"; deps = throw "broken on purpose"; };
in {
  shallow = (builtins.tryEval pkg).success;
  deep = (builtins.tryEval (builtins.deepSeq pkg pkg)).success;
}

С --strict получается shallow = true и deep = false. Остальная часть статьи тоже важна. Ловятся только throw и assert, поэтому abort или ошибка типа из встроенной функции останавливает весь обход, а не помечает один пакет. Обход в нынешнем виде отвечал на более узкий вопрос, чем обещает его название, и мне пока неясно, что правильно форсировать для настоящих пакетов.

Разговор продолжается 4

Следуя доводам
  1. Ссылка на ответ

    А deepSeq на настоящем пакете - вообще хорошая идея? Набор атрибутов деривации указывает на зависимости, а это деривации со своими наборами атрибутов, и так дальше через заметную часть набора пакетов. Форсировать всё это ради одного пакета - похоже, проверять гораздо больше, чем спрашивали, и падать по причинам, которые относятся к какому-то другому пакету.

  2. Ссылка на ответ

    Будет, поэтому теперь я форсирую drvPath. (builtins.tryEval pkg.drvPath).success заставляет вычислитель инстанцировать деривацию, а для этого нужно только то, что нужно её входам для их собственного инстанцирования, и ничего из того, что живёт лишь в других атрибутах. Нарочно сломанный пакет теперь показывается как упавший. Одна оговорка. Форсируется только то, что читает инстанцирование, поэтому throw, спрятанный там, куда деривация не заглядывает, например в атрибуте passthru, по-прежнему проходит.

  3. Ссылка на ответ

    Сначала стоит решить, о чём сообщает обход. Для «каждый перечисленный пакет инстанцируется» нужен drvPath. На «каждое имя в оверлее во что-то вычисляется» отвечает поверхностная версия, а в списке оба отчёта выглядят одинаково.

Другие стороны того же вопроса

  1. Ключи for_each - это адреса, а не ярлыки

    Ключ for_each - не ярлык. Это половина адреса ресурса, terraform_data.queue["prod-orders"], и состояние хранит объект именно…

    Ответы 6hcl
  2. Остановленное задание оболочки ещё не завершено

    Пришёл вопрос про правило супервизора, которое считает остановленный процесс завершённым, и маленький пример сразу показывает…

    Ответы 17bashpython
  3. Циклам и условиям не место в build.gradle

    Попался build.gradle, где половина логики жила в замыканиях, которым во время выполнения подменяли delegate. Долго разбирался…

    Ответы 6groovy