BIN_DIR := $(CURDIR)/bin APP_NAME ?= molva-app-backend VERSION ?= $(shell git describe --tags 2>/dev/null || echo "v0.0.0") BUILD_DATE := $(shell date -u +'%Y-%m-%dT%H:%M:%SZ') GIT_COMMIT := $(shell git rev-parse HEAD 2>/dev/null) LDFLAGS := "-s -w -X main.version=$(VERSION) -X main.commit=$(GIT_COMMIT) -X main.date=$(BUILD_DATE)" GOLANGCI_LINT_VERSION := v1.62.2 SWAG_VERSION := v1.16.2 ENV := "local" UNAME_S := $(shell uname -s) CONFIG_PATH := .build/config/ SWAGGER_DOCS_PATH := internal/http/swagger/docs ifeq ($(UNAME_S),Darwin) SED_INPLACE := -i '' else SED_INPLACE := -i endif ifeq ($(OS),Windows_NT) CONFIG_PATH := $(subst /,\,$(CONFIG_PATH)) endif .PHONY: all all: lint build ## -- Dependency Management -- .PHONY: install-tools install-tools: $(BIN_DIR)/golangci-lint $(BIN_DIR)/swag .PHONY: $(BIN_DIR)/golangci-lint $(BIN_DIR)/golangci-lint: @mkdir -p $(@D) @echo "Installing golangci-lint $(GOLANGCI_LINT_VERSION)..." @GOBIN=$(BIN_DIR) go install github.com/golangci/golangci-lint/cmd/golangci-lint@$(GOLANGCI_LINT_VERSION) .PHONY: $(BIN_DIR)/swag $(BIN_DIR)/swag: @mkdir -p $(@D) @echo "Installing swag $(SWAG_VERSION)..." @GOBIN=$(BIN_DIR) go install github.com/swaggo/swag/cmd/swag@$(SWAG_VERSION) ## -- Linting -- .PHONY: lint lint: $(BIN_DIR)/golangci-lint @echo "Running linter..." @$(BIN_DIR)/golangci-lint run --config .golangci-lint.yaml --fix=false --color=always ## -- Documentation -- .PHONY: docs docs: $(BIN_DIR)/swag @echo "Generating Swagger documentation..." @if [ -n "$(SWAGGER_HOST)" ]; then \ echo "Using SWAGGER_HOST: $(SWAGGER_HOST)"; \ $(MAKE) .generate-swagger-with-host HOST=$(SWAGGER_HOST); \ else \ echo "Using default host: localhost:8000"; \ mkdir -p $(SWAGGER_DOCS_PATH); \ $(BIN_DIR)/swag init -g cmd/main.go -o $(SWAGGER_DOCS_PATH) --parseDependency --parseInternal; \ echo "Swagger documentation generated in $(SWAGGER_DOCS_PATH)"; \ fi .PHONY: .generate-swagger-with-host .generate-swagger-with-host: $(BIN_DIR)/swag @echo "Генерация Swagger документации с host: $(HOST)" @mkdir -p $(SWAGGER_DOCS_PATH) @TEMP_MAIN="cmd/main_temp.go" && \ cp cmd/main.go $$TEMP_MAIN && \ ESC_HOST=$$(printf '%s\n' "$(HOST)" | sed -e 's/[\\\/&]/\\\\&/g') && \ sed $(SED_INPLACE) "s|localhost:8000|$${ESC_HOST}|g" $$TEMP_MAIN && \ $(BIN_DIR)/swag init -g $$TEMP_MAIN -o $(SWAGGER_DOCS_PATH) --parseDependency --parseInternal && \ rm -f $$TEMP_MAIN && \ echo "Swagger документация успешно сгенерирована с host: $(HOST)" && \ echo "Документация доступна по адресу: $(HOST)/swagger/index.html" ## -- Run -- ## To change env use: make run CONFIG_PATH={config file dir path} ENV={env} .PHONY: run run: @echo "Starting $(APP_NAME)..." @echo CGO_ENABLED=0 go run -ldflags=$(LDFLAGS) ./cmd/main.go --config_path=$(CONFIG_PATH) --env=$(ENV) @CGO_ENABLED=0 go run -ldflags=$(LDFLAGS) ./cmd/main.go --config_path=$(CONFIG_PATH) --env=$(ENV) ## -- Building -- .PHONY: build build: build-linux build-darwin build-windows # Build for Linux .PHONY: build-linux build-linux: @echo "Building for Linux..." @GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags=$(LDFLAGS) -o $(BIN_DIR)/$(APP_NAME)_linux_amd64 ./cmd/main.go @GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -ldflags=$(LDFLAGS) -o $(BIN_DIR)/$(APP_NAME)_linux_arm64 ./cmd/main.go # Build for macOS (Darwin) .PHONY: build-darwin build-darwin: @echo "Building for macOS..." @GOOS=darwin GOARCH=amd64 CGO_ENABLED=0 go build -ldflags=$(LDFLAGS) -o $(BIN_DIR)/$(APP_NAME)_darwin_amd64 ./cmd/main.go @GOOS=darwin GOARCH=arm64 CGO_ENABLED=0 go build -ldflags=$(LDFLAGS) -o $(BIN_DIR)/$(APP_NAME)_darwin_arm64 ./cmd/main.go # Build for Windows .PHONY: build-windows build-windows: @echo "Building for Windows..." @GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -ldflags=$(LDFLAGS) -o $(BIN_DIR)/$(APP_NAME)_windows_amd64.exe ./cmd/main.go @GOOS=windows GOARCH=arm64 CGO_ENABLED=0 go build -ldflags=$(LDFLAGS) -o $(BIN_DIR)/$(APP_NAME)_windows_arm64.exe ./cmd/main.go ## -- Docker -- .PHONY: docker-build docker-build: @echo "Building Docker image..." @docker build \ --build-arg BUILD_LDFLAGS=$(LDFLAGS) \ --build-arg SWAGGER_HOST=$(SWAGGER_HOST) \ --build-arg CONFIG_FILE_PATH="$(CONFIG_PATH)$(ENV).yaml" \ -t $(APP_NAME):$(VERSION) \ . .PHONY: docker-build-staging docker-build-staging: @echo "Building Docker image for staging..." @docker build \ --build-arg BUILD_LDFLAGS=$(LDFLAGS) \ --build-arg SWAGGER_HOST=api-staging.example.com \ --build-arg CONFIG_FILE_PATH="$(CONFIG_PATH)$(ENV).yaml" \ -t $(APP_NAME):staging \ . .PHONY: docker-build-production docker-build-production: @echo "Building Docker image for production..." @docker build \ --build-arg BUILD_LDFLAGS=$(LDFLAGS) \ --build-arg SWAGGER_HOST=api.example.com \ --build-arg CONFIG_FILE_PATH="$(CONFIG_PATH)$(ENV).yaml" \ -t $(APP_NAME):production \ . ## -- Cleanup -- .PHONY: clean clean: @echo "Cleaning..." @rm -rf $(BIN_DIR)