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.