Расскажу, пожалуй, еще одну интересную историю про Nim.
Но сначала познакомлю вас с действующими лицами сего повествования:
*
nim: компилятор Nim, rustc из мира Rust.*
nimble: пакетный менеждер для языка Nim. Примерный аналог cargo из мира Rust.*
choosenim: утилита, которая умеет устанавливать nim и nimble нужных версий, а также обновлять их. Примерный аналог rustup из мира Rust.Теперь можно начинать рассказ.
Однажды я заметил, что мой CI-пайплайн программы на Nim замедлился аж на целых пять минут! Все мы прекрасно помним
xz и Jia Tan, и как из-за тормозов openssh был найден очень хорошо спрятанный бэкдор. Но в случае с openssh замедление составляло сотни миллисекунд, а здесь — аж целых пять минут! Паранойя зашкаливает, желание разобраться — еще больше.В итоге, используя метод grep'а и внимательного чтения нагрепанного кода (очень полезный метод, кстати), я выяснил вот что:
*
choosenim скачивает бинарники nim и nimble (и еще кучу разных других нужных вещей), и распаковывает их* перед тем, как создать ссылки на распакованные бинарники в нужной папке,
choosenim зовет nimble --version, чтобы напечатать предупреждение, если версия nimble слишком древняя и не поддерживается*
nimble перед тем, как показать свою версию, проверяет свое окружение, и обнаруживает, что компилятора nim нет на месте* далее
nimble пытается исправить это безобразие. Для этого он сам клонирует репу с компилятором nim и собирает его из исходников!* сборка компилятора — конечно же, дело небыстрое, и занимает те самые пять минут. Скажем лишь спасибо, что компилятор собирается довольно быстро, и не приходится ждать часами.
В общем, предсказуемо никакого Jia Tan'а здесь не оказалось, зато оказался банальный баг. А с багами поступают обычно просто: репортят и ждут фикса. Пофиксили его, впрочем, быстро и легко: теперь
--version лишь выводит версию и больше ничего сделать не пытается.Выводы из этой истории делайте сами.