Go微服务框架Kratos中makefile命令的使用方法及报错处理

运用 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博客

注意:windows系统中,如遇“Command syntax error”错误,可能与make版本有关。具体可见【报错处理】部分

二、安装 git(重要)

上述 makefile 文件中,查找相关文件是使用的 git 中的 bin/bash.exe。具体安装方法略去。

注意:git 的安装路径不能有空格。 (我因为这个问题查了整整一个下午,心痛!!)具体可见【报错处理】部分

三、操作方法

①项目环境初始化

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)"))

② windows 开发环境下,使用 make api 时,报错:

Error makefile 6: Command syntax error

原因:

windows系统中安装了三个版本的make(通过 where make 命令查看),其中两个是安装delphi开发工具时自带的(version 5.41),另一个是通过cygwin工具包安装的(version 4.4.1)。

在调用make命令时,如果不明确指明使用哪个路径下的make,那么windows系统会调用环境变量中排在最前面的那个版本的make。

在我的电脑中,delphi 版自带的make命令排在环境变量前面,这个版本的make在解析 kratos 的 Makefile 文件时报上述错误。

解决方法: 

将通过 cygwin 工具包安装的make的环境变量移动到最前面

移动后,通过 make -v 命令查看,显示结果如下:

五、总结

由于之前对 makefile 命令不熟悉,报错之后各种百度,始终找不到问题原因,浪费了很多时间(一整个下午)。后来分析 makefile 文件中的命令行,将长命令行拆分为短命令行,并打印出每个短命令行的输出内容。一步步才分析出路径中含有空格的问题。

相关推荐

  1. Go自研服务框架-日志处理

    2024-06-18 06:54:01       43 阅读
  2. Go自研服务框架-参数处理

    2024-06-18 06:54:01       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-18 06:54:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-18 06:54:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-18 06:54:01       82 阅读
  4. Python语言-面向对象

    2024-06-18 06:54:01       91 阅读

热门阅读

  1. supersocket的socket层源码解析

    2024-06-18 06:54:01       33 阅读
  2. codeArts Snap:辅助你的编程神器

    2024-06-18 06:54:01       31 阅读
  3. 机器学习中的神经网络重难点!纯干货(上篇)

    2024-06-18 06:54:01       34 阅读
  4. LeetCode 619, 58, 24

    2024-06-18 06:54:01       43 阅读
  5. 随机梯度下降(SGD)

    2024-06-18 06:54:01       32 阅读
  6. 【shell脚本个人随笔记录】

    2024-06-18 06:54:01       33 阅读