25 июля 2026 г.
Nix в justfile без распугивания коллег
Фиксировать версии зависимостей проекта — стандарт индустрии.
Обычно с помощью .lock файла.
Развитие этой идеи — зафиксировать само окружение разработки: конкретный компилятор, конкретный линтер, одни и те же версии в CI и на машинах всех разработчиков.
Но пока в индустрии нет де-факто стандарта фиксации версий окружения.
Часто Docker в CI выступает точкой синхронизации, но локально запускать окружение в Docker достаточно неудобно.
Nix хорошо решает задачу фиксации dev-окружений, и я потихоньку внедряю его на работе. Загвоздка в высоком пороге входа: принудительные разборки с локальной установкой Nix всех только обозлят. Поэтому Nix должен быть опциональным. Но встроенным в поведение по умолчанию, чтобы разработчику не приходилось вспоминать его использовать.
Мои команды уже используют justfile’ы.
Этот пост о том, как заставить just работать на тех, кто перешёл на Nix, и на тех, кто ещё использует системное окружение.
Пост не покрывает создание flake.nix и dev shell’а.
Обёртка
Вставьте эти две строки в начало justfile:
have_nix := `command -v nix >/dev/null 2>&1 && echo true || echo false`
wrap := if env("IN_NIX_SHELL", "") != "" { "" } else if have_nix == "true" { "nix develop --command " } else { "" }
И добавьте {{wrap}} в начало рецептов:
test:
{{wrap}}cargo test
Теперь just test сконвертирован.
Принцип работы
wrap принимает одно из двух значений, покрывая три ситуации:
- Уже внутри dev shell’а — установлена
IN_NIX_SHELL, поэтомуwrapпустой и команда выполняется как есть. Нет смысла вкладывать shell в shell. - Nix установлен —
wrapпревращается вnix develop --command, и рецепт выполняется с инструментами, зафиксированными во флейке. - Nix нет —
wrapснова пустой. Рецепт выполняется с тем, что есть вPATH, ровно так, как если бы этих двух строк не существовало.
Коллега без Nix не заметит разницы. Ничего не нужно устанавливать, никаких сообщений об ошибках, никакого раздела в README. Узнать о существовании обёртки можно, только если специально пойти искать.
Принудительное отключение Nix
just позволяет переопределить переменную обёртки из командной строки:
just --set wrap "" test
Никаких изменений в justfile или переменных окружения.
Больше примеров можно найти в justfile’ах git-plumber и do-next.