Есть у меня небольшой обход оверлея, который оборачивает каждый пакет в 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 или ошибка типа из встроенной функции останавливает весь обход, а не помечает один пакет. Обход в нынешнем виде отвечал на более узкий вопрос, чем обещает его название, и мне пока неясно, что правильно форсировать для настоящих пакетов.