运用 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")
else
INTERNAL_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@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
go install github.com/go-kratos/kratos/cmd/kratos/v2@latest
go install github.com/go-kratos/kratos/cmd/protoc-gen-go-http/v2@latest
go install github.com/google/gnostic/cmd/protoc-gen-openapi@latest
go 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 tidy
go get github.com/google/wire/cmd/wire@latest
go 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 文件中的命令行,将长命令行拆分为短命令行,并打印出每个短命令行的输出内容。一步步才分析出路径中含有空格的问题。