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

news2025/11/11 1:01:30

运用 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 文件中的命令行,将长命令行拆分为短命令行,并打印出每个短命令行的输出内容。一步步才分析出路径中含有空格的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1822431.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【讯为Linux驱动开发】6.自旋锁spinlock

【自旋锁】 线程A获取自旋锁后,B假如想获取自旋锁则只能原地等待,仍占用CPU,不会休眠,直到获取自旋锁为止。 【函数】 DEFINE SINLOCK(spinlock t lock) 定义并初始化一个变量int spin lock init(spinlock t*lock) 初始化自…

工业4.0下的PLC进化论:ARMxy计算机如何重塑自动化

智能物流系统的高效与精准成为企业竞争力的关键。在这个背景下,传统的PLC系统因其固有的局限性,如扩展性差、系统封闭等,开始显得力不从心。ARMxy工业计算机作为新一代的PLC替代方案,凭借其低功耗、高性能以及高度的灵活性&#x…

OpenStack入门初体验

云计算概述 概念 侠义的云计算是指IT基础设施的交付和使用模式广义的云计算是指服务的交付和使用模式云计算资源 网络资源存储资源计算资源 云计算的服务模型 IaaS(基础架构即服务) IaaS 提供最底层的 IT 基础设施服务,包括处理能力、存储…

Spotify 音乐平台宣布成立内部创意机构,测试生成式人工智能配音广告

Spotify是一家流媒体音乐平台,提供广泛的音乐、播客和视频内容。用户可以通过订阅服务Spotify Premium来享受更多高级功能,如无广告播放、离线听歌等。 Spotify 周四宣布,它将通过其首家名为 Creative Lab 的内部创意机构进一步进军广告领域…

夏季城市环境卫生挑战多:TSINGSEE青犀智慧环卫方案助力城市垃圾站智能管理

一、背景分析 夏季,随着气温的攀升,城市垃圾的数量和种类也随之增加,这给环卫工作带来了极大的挑战。环卫垃圾站点作为城市垃圾处理的重要一环,其管理效率直接关系到城市环境的整洁与卫生。近年来,随着视频监控技术的…

Word恢复未保存文件怎么做?4招助你拯救数据!

“着急!我在编辑Word文档时,还没有来得及保存文件,系统就崩溃了,现在文件找不到了,还有方法能找回来吗?” 在数字时代,我们的日常生活和工作都离不开Word文档。然而,我们有时候辛苦编…

YUV格式与RGB格式详解

图像处理 文章目录 图像处理前言YUV 格式YUV 采样 前言 像素格式描述了像素数据存储所用的格式,定义了像素在内存中的编码方式。RGB 和 YUV 为两种经常使用的像素格式。/ 1024 / 1024 2.63 MB 存储空间。 RGB 和 RGBA 格式 RGB 图像具有三个通道 R、G、B&#xff…

多模态大模型:识别和处理图片与视频的技术详解

多模态大模型:识别和处理图片与视频的技术详解 多模态大模型:识别和处理图片与视频的技术详解1. 什么是多模态大模型?2. 多模态大模型的基本架构3. 识别和处理图片3.1 图像特征提取3.2 图像分类与识别3.3 图像生成与增强 4. 识别和处理视频4.…

Idea jdk配置的地方 启动时指定切换的地方

jdk 配置的地方 项目sdk 所在位置 管理添加或删除的地方,增加后,可以在在上面切换 启动时指定版本

孩子小学毕业了

难说再见 时间已到眼前 一张张照片 模糊了我双眼

什么是微控制器中的欠压复位?如何防止误断电

微控制器的“掉电”是指电源电压部分暂时降低到可靠运行所需的水平以下。许多微控制器都有一个保护电路,可以检测电源电压何时低于此水平,并将设备置于复位状态,以确保电源恢复时正确启动。此操作称为“欠压复位”或 BOR。类似的功能称为低电…

忆捷硬盘数据恢复方法有哪些?常见的有这四种

在数字化时代,硬盘作为存储大量数据的重要设备,其安全性与可靠性直接关系到我们的工作和生活。然而,无论是由于误操作、病毒感染还是硬件故障,硬盘数据丢失的情况时有发生。对于使用忆捷硬盘的用户来说,如何在数据丢失…

Spring Boot集成 Spring Retry 实现容错重试机制并附源码

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

PointNet网络模型代码解析

PointNet网络模型代码解析 T-Net3dT-NetkdFeatNetPointNetCls网络结构可视化 论文地址:https://arxiv.org/pdf/1612.00593 参考代码地址:https://github.com/fxia22/pointnet.pytorch; T-Net3d 首先数据输入为n*3,然后接一个T-n…

windows上安装redis,并且用pycharm联通调用测试

在 Windows 上启动 Redis,官网版本不支持windows直接安装,你可以按照以下步骤进行操作: 使用Github Redis 版本启动 Redis 如果你想使用 Redis 在 Windows 上启动 Redis,以下是基本的步骤: 下载 Redis: 访…

在录制视频的时候,自动出现英伟达(nvidia)显卡弹窗关闭方式

具体情况具体分析,我遇见的是录制视频在视频里面出现弹窗问题 显示效果 在使用录制视频工具进行录制,回放视频的时候,视频会自动弹出英伟达显卡的弹窗,这个我们不需要,就把他关闭 关闭方式 找到GeForce Experienc…

能耗监控与管理平台

在当今社会,随着工业化、城市化的快速发展,能源消耗问题日益凸显,节能减排已成为全社会共同关注的焦点。在这个背景下,一款高效、智能的能耗监控与管理平台显得尤为重要。 一、HiWoo Cloud平台的概念 HiWoo Cloud是一款集数据采…

【权威出版/投稿优惠】2024年智慧城市与信息化教育国际会议(SCIE 2024)

2024 International Conference on Smart Cities and Information Education 2024年智慧城市与信息化教育国际会议 【会议信息】 会议简称:SCIE 2024 大会时间:点击查看 大会地点:中国北京 会议官网:www.iacscie.com 会议邮箱&am…

江协科技51单片机学习- p7 独立按键控制LED灯

前言: 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记,在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。 引用: 51单片机入门教程-2…

Windows中LoadLibrary加载动态库失败,详细解释(解决思路)

今天在开发的过程中,需要用到动态库里的一些接口,又不希望全部载入,在这过程中使用LoadLibrary加载dll时,出现问题,特此记录一下自己怎么解决的思路。 目录 先介绍一下这几个函数为以下错误分析做准备 GetProcAddres…