오버레이의 패키지마다 builtins.tryEval을 씌우고 실패하는 것만 나열하는 작은 점검 스크립트를 짰어요. 그런데 전부 괜찮다고 나왔어요. 의존성 목록에 throw를 넣어 일부러 망가뜨린 패키지까지요.
항목을 끝까지 읽으면 매뉴얼에 분명히 적혀 있어요. tryEval은 얕게 평가해요. 패키지는 attribute set이라 그 형태까지만 가면 성공이고, 안쪽은 아무것도 강제되지 않아요.
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나 builtin의 타입 오류가 나면 패키지 하나를 실패로 표시하는 대신 점검 전체가 멈춰요. 지금 짠 점검은 이름이 말하는 것보다 좁은 질문에 답한 셈이고, 실제 패키지에서 무엇을 강제해야 맞는지는 아직 잘 모르겠어요.