Skip to content
Snippets Groups Projects
Makefile 3.68 KiB
.PHONY: proto logging mocks .FORCE

SHELL = bash

PROTODIR=perxis-proto/proto
DSTDIR=./proto
ALLPROTO?=$(shell find -L $(PROTODIR) -name '*.proto' )
# Убираем status.proto нужен только для front
PROTOFILES=	$(filter-out $(PROTODIR)/status/status.proto, $(ALLPROTO))
PROTOGOFILES=$(PROTOFILES:.proto=.pb.go)
PROTOGOGRPCFILES=$(PROTOFILES:.proto=_grpc.pb.go)

ACCESSLOGGING=$(shell find -name "logging_middleware.go" -type f)
ERRORLOGGING=$(shell find -name "error_logging_middleware.go" -type f)
SERVICETELEMETRY=$(shell find -name "telemetry_middleware.go" -type f)
SERVICEMIDDLEWARE=$(shell find -name "middleware.go" -type f)
SERVICERECOVERING=$(shell find -name "recovering_middleware.go" -type f)

# Генерация grpc-клиентов для go
proto: protoc-check protoc-gen-go-check $(PROTOGOFILES)
	@echo "Generate Go from proto files"
	@find $(PROTODIR) -name '*.proto'

%.pb.go: %.proto
	@protoc -I=$(PROTODIR) --experimental_allow_proto3_optional --go_out=$(DSTDIR) --go-grpc_out=$(DSTDIR) --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative "$<"

proto-clean:
	@rm -r $(DSTDIR)/*

# Helpers
#
# Проверка, что установлен компилятор для Protobuf
protoc-check:
ifeq (,$(shell which protoc))
	$(error "Protocol Buffers not found. Run \"brew install protobuf\" \
	or visit \"https://grpc.io/docs/protoc-installation/#install-using-a-package-manager\" for more.\n")
endif

# Проверяется, установлен ли 'protoc-gen-go' - плагин для генерации GRPC-Go клиента
protoc-gen-go-check:
ifeq (,$(wildcard $(GOPATH)/bin/protoc-gen-go))
	$(error "Protocol Buffers Go plugin not found. \
	Run \"go install google.golang.org/protobuf/cmd/protoc-gen-go@latest google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest\" \
	or visit \"https://grpc.io/docs/languages/go/quickstart/\" for more.\n")
endif

# Генерация логгирования (access & error) для всех сервисов. Предполагается наличие файлов `logging_middleware.go/error_middleware.go`
# с директивой go:generate и командой генерации кода в директориях `/pkg` сервисов
# Для установки инструмента генерации выполнить команду `go get -u github.com/hexdigest/gowrap/cmd/gowrap`
logging: $(ERRORLOGGING) $(ACCESSLOGGING)

%/middleware/logging_middleware.go: .FORCE
	@echo "$@"
	@go generate "$@"

%/middleware/error_logging_middleware.go: .FORCE
	@echo "$@"
	@go generate "$@"

telemetry: $(SERVICETELEMETRY)

%/middleware/telemetry_middleware.go: % .FORCE
	@echo "$@"
	@go generate "$@"

middleware: $(SERVICEMIDDLEWARE)

%/middleware/middleware.go: % .FORCE
	@echo "$@"
	@go generate "$@"

recovering: $(SERVICERECOVERING)

%/middleware/recovering_middleware.go: % .FORCE
	@echo "$@"
	@go generate "$@"

# Генерация моков для всех интерфейсов, найденных в директории. Выходные файлы с моками сохраняются в `./mocks`
MOCKSDIRS?=$(shell find . -name "service.go" -exec dirname {} \;)
MOCKS=$(MOCKSDIRS:=/mocks)
PROTOMOCKS=$(PROTODIR:=/mocks)

mocks: $(PROTOMOCKS)
	@echo "Generate mocks $<"

%/mocks: %
	@echo "$@ - $<"
	@mockery --log-level="error" --all --dir "$<" --output="$@"

mocks-clean:
	@rm -rf $(MOCKS)


# Deprecated
# Генерация кода для go-kit при помощи 'github.com/devimteam/microgen' - go-kit перешел на github.com/recolabs/microgen/cmd/microgen
#MICROGENFILES?=$(shell find . -name "service.go" -exec grep -Ril "microgen" {} \;)
#microgen: $(MICROGENFILES)
#
#%/service.go: % .FORCE
#	-microgen -file "$@" -out "$<"