运用 kratos 微服务框架开发项目时,可以使用提供的 makefile 中的命令自动且快速生产相关代码,提高开发效率。
krotos中makefile文件内容如下:
GOHOSTOS:=$(shell go env GOHOSTOS)
GOPATH:=$(shell go env GOPATH)
VERSION=$(shell git describe --tags --always)ifeq ($(GOHOSTOS), windows)#the `find.exe` is different from `find` in bash/shell.#to see https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/find.#changed to use git-bash.exe to run find cli or other cli friendly, caused of every developer has a Git.#Git_Bash= $(subst cmd\,bin\bash.exe,$(dir $(shell where git)))Git_Bash=$(subst \,/,$(subst cmd\,bin\bash.exe,$(dir $(shell where git))))INTERNAL_PROTO_FILES=$(shell $(Git_Bash) -c "find internal -name *.proto")API_PROTO_FILES=$(shell $(Git_Bash) -c "find api -name *.proto")
elseINTERNAL_PROTO_FILES=$(shell find internal -name *.proto)API_PROTO_FILES=$(shell find api -name *.proto)
endif.PHONY: init
# init env
init:go install google.golang.org/protobuf/cmd/protoc-gen-go@latestgo install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latestgo install github.com/go-kratos/kratos/cmd/kratos/v2@latestgo install github.com/go-kratos/kratos/cmd/protoc-gen-go-http/v2@latestgo install github.com/google/gnostic/cmd/protoc-gen-openapi@latestgo install github.com/google/wire/cmd/wire@latest.PHONY: config
# generate internal proto
config:protoc --proto_path=./internal \--proto_path=./third_party \--go_out=paths=source_relative:./internal \$(INTERNAL_PROTO_FILES).PHONY: api
# generate api proto
api:protoc --proto_path=./api \--proto_path=./third_party \--go_out=paths=source_relative:./api \--go-http_out=paths=source_relative:./api \--go-grpc_out=paths=source_relative:./api \--openapi_out=fq_schema_naming=true,default_response=false:. \$(API_PROTO_FILES).PHONY: build
# build
build:mkdir -p bin/ && go build -ldflags "-X main.Version=$(VERSION)" -o ./bin/ ./....PHONY: generate
# generate
generate:go mod tidygo get github.com/google/wire/cmd/wire@latestgo generate ./....PHONY: all
# generate all
all:make api;make config;make generate;# show help
help:@echo ''@echo 'Usage:'@echo ' make [target]'@echo ''@echo 'Targets:'@awk '/^[a-zA-Z\-\_0-9]+:/ { \helpMessage = match(lastLine, /^# (.*)/); \if (helpMessage) { \helpCommand = substr($$1, 0, index($$1, ":")); \helpMessage = substr(lastLine, RSTART + 2, RLENGTH); \printf "\033[36m%-22s\033[0m %s\n", helpCommand,helpMessage; \} \} \{ lastLine = $$0 }' $(MAKEFILE_LIST).DEFAULT_GOAL := help
一、安装 GNU Make
使用make命令前,需要下载安装 GNU Make,可以参考 在windows系统下安装make编译功能_windows安装make-CSDN博客
二、安装 git(重要)
上述 makefile 文件中,查找相关文件是使用的 git 中的 bin/bash.exe。
三、操作方法
①项目环境初始化
make init
②根据proto文件生产go接口相关代码
make api
③根据配置相关文件(internal/conf目录)生产go代码
make config
④生成依赖注入相关go代码
make generate
⑤编译构建工程
make build
⑥综合生成接口、配置及依赖注入相关代码
make all
四、报错处理
① windows 开发环境下,使用 make api 时,报错:/bin/sh: -c: line 1: syntax error
或者 /bin/sh: line 1: C:/Program: No such file or directory
原因:
make api 命令需要查找 git 安装目录中的 bash.exe,如果路径不对,或路径中有空格(默认安装在c:\program files\git路径下),则会报上述错误,具体出错位置为makefile文件中的如下代码:
Git_Bash=$(subst \,/,$(subst cmd\,bin\bash.exe,$(dir $(shell where git))))//$(shell where git) 获取 git.exe 的路径+文件名,如:C:\Git\cmd\git.exe
//$(dir ...) 表示获取文件的路径,比如 C:\Git\cmd\
//$(subst cmd\,bin\bash.exe,$(dir $(shell where git)))表示将路径中的 cmd\ 全部替换为 bin\bash.exe
//$(subst \,/,...)表示将路径中的 \ 替换为 /
$(dir ...)函数要求文件路径中没有空格,否则解析路径异常,如下:
.PHONY: test
test: @echo "$(dir c:/test file/test.exe)"//文件路径中存在空格,解析异常,输入内容为:c:/ file/
//正确的做法:需要在路径中加双引号,比如 @echo "$(dir "c:/test file/test.exe")"
解决方法:
方法1:重新安装 git,使 git 安装路径中没有空格,如:C:\Git\cmd
方法2:修改 makefile 文件,git 路径加上双引号,如下:
//原代码:
Git_Bash=$(subst \,/,$(subst cmd\,bin\bash.exe,$(dir $(shell where git))))//改为如下代码:
Git_Bash=$(subst \,/,$(subst cmd\git.exe,bin\bash.exe,"$(shell where git)"))
五、总结
由于之前对 makefile 命令不熟悉,报错之后各种百度,始终找不到问题原因,浪费了很多时间(一整个下午)。后来分析 makefile 文件中的命令行,将长命令行拆分为短命令行,并打印出每个短命令行的输出内容。一步步才分析出路径中含有空格的问题。