В make ошибки по умолчанию останавливают сборку. Это безопасно: как только одна команда завершилась с ненулевым кодом, make считает цель сломанной. Но на практике нужны разные стратегии обработки ошибок: откатить артефакты, продолжить выполнение или осознанно проигнорировать сбой.
1. Stop by default — базовое поведение
Если команда завершилась с ошибкой, выполнение рецепта прерывается:
build:
go build ./...
cp app /deploy/
Если go build упадёт, копирование не начнётся. Это защищает от “грязной” сборки.
2. Rollback — откат после ошибки 🔁
make не умеет транзакции из коробки, поэтому rollback реализуют вручную в shell-командах:
deploy:
cp app /deploy/app.new && \
mv /deploy/app.new /deploy/app || \
{ rm -f /deploy/app.new; exit 1; }
Идея простая:
- сначала создаём временный артефакт
- заменяем основной файл только после успешного шага
- при ошибке чистим хвосты
Для каталогов и сборочных файлов полезен .DELETE_ON_ERROR:
.DELETE_ON_ERROR:
Если цель начала создаваться, но команда завершилась ошибкой, make удалит повреждённый файл. Это важная защита от частично собранных артефактов.
3. Resume — продолжить сборку несмотря на ошибки 🚀
Если нужно собрать максимум возможного, используйте ключ -k (--keep-going):
make -k
make продолжит выполнять независимые цели, даже если одна из них упала. Это полезно:
- в CI для массовой проверки модулей
- при сборке нескольких независимых компонентов
- для получения полного списка проблем за один прогон
Важно: -k не “чинит” зависимости. Если цель зависит от сломанной, она тоже не соберётся.
4. Ignore — осознанно игнорировать ошибки 🙈
Иногда ошибка допустима: например, файл может уже отсутствовать.
clean:
-rm -f app
Префикс - говорит make: не останавливайся, даже если команда вернула ошибку.
Альтернатива — глобальный режим:
.IGNORE: clean
.IGNORE:
Но глобальный ignore опасен: можно скрыть реальные проблемы. Лучше применять точечно.
5. Когда использовать какую стратегию 📌
- Rollback — при деплое, миграциях, работе с артефактами
- Resume — при batch-сборках, тестах, мультипроектных пайплайнах
- Ignore — для cleanup и необязательных шагов
Практический совет ✅
Лучший подход в make — не подавлять ошибки без необходимости.
- Сначала: безопасные временные файлы +
.DELETE_ON_ERROR - Затем:
-k, если нужен полный отчёт - И только потом:
-или.IGNOREдля контролируемых исключений
Грамотная обработка ошибок в make делает сборку предсказуемой, а CI/CD — заметно надёжнее. 🔧
Подборку каналов про IT — с практикой, DevOps, backend и инфраструктурой — стоит посмотреть ниже.