make как точка входа в Go-проектКогда работаете над Go-проектом в команде, быстро появляется проблема: каждый запускает сборку и тесты по-своему. Один пишет
go build -o app, другой забыл флаги линтера, третий вообще не знает, какую команду использовать. Makefile решает это раз и навсегда.Что такое Makefile и зачем он нужен
Makefile это файл с набором именованных команд. Вы описываете, что делает каждая цель, а потом вызываете её одним словом. Больше не нужно помнить длинные команды или держать их в заметках.Вот базовый пример для Go-проекта:
run:
go run .
test:
go test ./...
lint:
golangci-lint run
build:
go build -o app
Теперь вместо того, чтобы каждый раз вспоминать точный синтаксис:
make run
make test
make build
Как это работает
make читает Makefile в текущей директории и выполняет команды под нужной целью. Каждая цель это метка, за которой идут shell-команды с отступом через табуляцию. Важный момент: отступ должен быть именно табом, не пробелами, иначе make вернёт ошибку.Можно добавить зависимости между целями. Например, чтобы тесты всегда запускались после линтера:
check: lint test
Или сделать
build зависимым от test, чтобы не собирать проект с непрошедшими тестами:build: test
go build -o app
Makefile быстро обрастает полезными целями. Несколько примеров:.PHONY: run test lint build clean
clean:
rm -f app
tidy:
go mod tidy
cover:
go test ./... -coverprofile=coverage.out
go tool cover -html=coverage.out
Директива
.PHONY говорит make, что эти цели не являются именами файлов. Без неё, если в директории окажется файл с именем build, make решит, что цель уже выполнена и ничего не запустит.Makefile это простой способ зафиксировать рабочие команды проекта в одном месте. Новый человек в команде запускает make build и всё работает так же, как у остальных. Не нужно читать README в поисках нужной команды и не нужно помнить флаги наизусть.📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoDeep
