butthurt nixos
Правильно ли я понял, что пакетник nix делится на две совершенно разные задачи, которые легко отделить друг от друга, а именно
1. Управление деривейшенами, где деривейшен — это либо загрузка иссодников, либо, условно, тройка из:
1.1 Всех инпутов деривейшена, необходимых для сборки, включая библиотеки, заголовочники, бинари, сборочные утилиты (make, gcc, ghc, итд)
1.2 Сборочный скрипт, который находясь в окружении инпутов генерирует аутпуты не важно как
1.3 Список всех аутпутов деривейшена, которые могут быть отдельной зависимостью другого деривейшена, как и сам деривейшен целиком.
Эта задача включает в себя подготовоку окружения для сборки, очистку временных каталогов после сборки, сборку мусора, управление профилями пользователей и т.д. Короче все, чем занимаются nix-build, nix-env, nix-store. Эту задачу можно было бы даже решить на C++ (но не нужно), по крайней мере теперь уже позно что-то менять, ибо оно уже на крестах.
2. Задача генерации этих самых деривейшенов из конфигурации. И вот тут уже отдельный язык мягко говоря не нужен, особенно такой убогий, как ленивый джаваскрипт, коим является по сути nix language. Вот сейчас сборище пакетов nixpkgs представляет из себя нереально сложную программу на nix, которая читает конфигурацию, создает окружения на базе окружений, повторяет логику сборочных утилит для различных языков (сборка пакетов для haskell, ruby, python, qoc, perl ...), содержит СТАНДАРТНУЮ БИБЛИОТЕКУ для работы со списками, хешами и прочими примитивами, которые в нормальных языках давно есть.
В этой программе в почти невозможно разобраться, благодаря динамичности языка, и одновременно отсутствию инструментария, как у взрослых динамических языков. А также наличию конструкци `with`, которая вносит в скоуп все из параметра, значение которого по коду определить невозможно, потому что оно генерируется рекурсивными рекурсиями, которые берут неизвестный инпут, добавляют в него некоторые поля, ожидая от инпута определенного значения, и передают дальше ленивом джаваскрипте. Программа обладает космической цикломатической сложностью, если говорить короче. Разобраться, как она работает дико сложно, я все выходные и понедельник на это убил.
Имеем write only язык, разобраться в программах на котором может только сам автор, и то в течении ограниченного срока после написания. Т.е. какой нибудь пхп, лишп, перл, или жс подошли бы тут не хуже, чем nix language, но у них хотябы инструменты для отладки и тестирования есть а также прости господи IDE, без которой в них никуда.
И вот первая задача решена хорошо, а вторая еле работает. Как они поддерживают nixpkgs? Они реально такие сверхлюди, что могут это писать, и понимать, что они на самом деле делают, или ...? КАК ТАК ТО?