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

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

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

相关文章

java程序什么时候需要在运行的时候动态修改字节码对象

一、java程序什么时候需要在运行的时候动态修改字节码对象 我认为有两种场景,一种是无法修改源代码的时候;另外一种是功能增强的时候。 1、无法修改源代码 举个例子,java程序依赖的第三方的jar包中发现了bug,但是官方还没有修复…

JS直接赋值复选框value无法显示

citySelect.value city这样会因为select复选框标签中没有对应value为city的值的option而无法显示。 解决办法&#xff1a; const cityHtml cityRes.list.map(v > {return <option value"${v}">${v}</option>}).join()citySelect.innerHTML <op…

【ai】triton-inference-server本地运行

官方地址下载源码 triton-inference-server/server zhangbin@LAPTOP-Y9KP MINGW64 /x/02_triton_inf_server $ git clone -b r24.05 https://github.com/triton-inference-server/server.gitCloning into server... remote: Enumerating objects: 46395, done. remote: Counti…

工程设计问题-步进锥滑轮问题

该问题的主要目标是用5个变量使4阶锥皮带轮的重量最小&#xff0c;其中4个变量是皮带轮每个台阶的直径&#xff0c;最后一个变量是滑轮的宽度。该问题包含11个非线性约束&#xff0c;以保证传动功率必须为0.75马力。 Abhishek Kumar, Guohua Wu, Mostafa Z. Ali, Rammohan Mall…

启动mysql 3.5时出现 MySql 服务正在启动 . MySql 服务无法启动。

有可能是端口冲突 netstat -ano | findstr :3306运行这段代码出现类似&#xff1a; 可以看到端口 3306 已经被进程 ID 为 6284 的进程占用。为了启动新的 MySQL 服务&#xff0c;我们需要停止这个进程或更改新服务的端口&#xff1a; 1、终止进程 taskkill /PID 6284 /F2、确…

【计算机毕业设计】基于Springboot的车辆管理系统【源码+lw+部署文档】

包含论文源码的压缩包较大&#xff0c;请私信或者加我的绿色小软件获取 免责声明&#xff1a;资料部分来源于合法的互联网渠道收集和整理&#xff0c;部分自己学习积累成果&#xff0c;供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者…

贷款投资决策和常用财务函数

前段时间上了一门excel操作的课&#xff0c;本文结合其中介绍财务函数以及投资决策分析相关的部分&#xff0c;对贷款中的现金流计算进行深入的分析。 以等额本息产品为例进行实操计算&#xff0c;假设某产品本金12000元&#xff0c;期限12&#xff0c;IRR利率24%。每期还款113…

项目:双人五子棋对战-对战模块(6)

完整代码见: 邹锦辉个人所有代码: 测试仓库 - Gitee.com 当玩家进入到游戏房间后, 就要开始一局紧张而又刺激的五子棋对战了, 本文将就前端后端的落子与判断胜负的部分作详细讲解. 模块详细讲解 约定前后端交互的接口 首先是建立连接后, 服务器需要生成一些游戏的初始信息(可…

c语言——扫雷游戏(简易版)

目录 前言游戏设计 前言 什么是扫雷游戏&#xff1f; 游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子&#xff0c;同时避免踩雷&#xff0c;踩到一个雷即全盘皆输。 这个游戏对于c语言的初学者来说难度还是挺大的&#xff0c;那我就实现一个初学者也能快速学…

黄仁勋最新建议:找到一门技艺,用一生去完善、磨炼!

“你可能会找到你的英伟达。我希望你们将挫折视为新的机遇。” 黄仁勋职业生涯中最大的教诲并非来自导师或科技公司 CEO&#xff0c;而是来自他在国际旅行时遇到的一位园丁。 近日在加州理工学院毕业典礼上发表演讲时&#xff0c;黄仁勋向毕业生分享了自己在日本京都的小故事。…

2012-2022年各省新质生产力指数数据(含原始数据+结果)

2012-2022年各省新质生产力指数数据&#xff08;含原始数据结果&#xff09; 1、时间&#xff1a;2012-2022年 2、指标&#xff1a;province、year、平均受教育年限、劳动者人力资本结构、高等院校在校学生结构、人均GDP元、在岗职工工资&#xff1a;元、三产从业人员比重、机…

各种机器学习算法的应用场景分别是什么(比如朴素贝叶斯、决策树、K 近邻、SVM、逻辑回归最大熵模型)?

2023简直被人工智能相关话题席卷的一年。关于机器学习算法的热度&#xff0c;也再次飙升&#xff0c;网络上一些分享已经比较老了。那么今天借着查询和学习的机会&#xff0c;我也来浅浅分享下目前各种机器学习算法及其应用场景。 为了方便非专业的朋友阅读&#xff0c;我会从算…

电子设计教程基础篇(电容)

文章目录 前言一、电容原理1.原理2.公式 二、电容种类1.结构1、固定电容2、可变电容3、微调电容 2.介质材料1、气体介质电容1、空气电容2、真空电容3、充气式电容 2、固体介质电容1、无机1、云母电容2、陶瓷电容1、瓷片电容2、独石电容 3、玻璃釉电容&#xff08;CI&#xff09…

MySQL Connector/C++ 和 MySQL Connector/ODBC 的区别

MySQL Connector/C++ 和 MySQL Connector/ODBC 是两种不同的数据库连接工具,它们各自有不同的特点和用途。以下是它们之间的一些主要区别: 1. **编程接口**: - MySQL Connector/C++ 提供了面向对象的编程接口,它是用C++编写的,提供了C++特有的类和对象来与MySQL数据库…

【双系统 安装ADB】

安装ADB 在Windows上安装ADB 下载ADB工具包&#xff1a;从 Google官方 下载ADB工具包。解压文件&#xff1a;将下载的zip文件解压到一个方便的位置。配置环境变量&#xff1a; 打开系统属性&#xff0c;选择“高级系统设置”。点击“环境变量”按钮&#xff0c;找到“Path”变…

爆火的治愈系插画工具又来了,额度居然有18w,根本花不完?

AI治愈插画又又又来了 今天给大家推荐一款完全免费的软件&#xff0c;用过的人都说好&#xff01; 先来看看我生成的图 制作过程非常简单&#xff0c;输入你想要生成的画面咒语。 工具地址&#xff1a;https://www.qiyuai.net/ 模型目前有两种 我上面的图就是用的第一种通用…

LiteOS使用不当导致软件定时器无响应问题

现象 系统最先创建的软件定时器无响应&#xff0c;但是任务可以正常调度。 解决 可能原因&#xff1a; 软件定时器初始化未正确完成。软件定时器的创建或注册过程中出现错误。软件定时器被错误地删除或释放。系统中存在线程竞争问题&#xff0c;导致定时器列表在访问时出现…

数据可视化案例

数据可视化案例 使用豆瓣电影中的数据来进行可视化&#xff0c;网址&#xff1a;豆瓣电影 Top 250 (douban.com) 一、网页数据分析 我们需要爬取的是豆瓣电影Top250网页每一页的电影名称、图片链接、导演、年份、国家、电影类型、电影评分这些数据。 在待爬取的网页中&#x…

通义千问调用笔记

如何使用通义千问API_模型服务灵积(DashScope)-阿里云帮助中心 package com.ruoyi.webapp.utils;import com.alibaba.dashscope.aigc.generation.Generation; import com.alibaba.dashscope.aigc.generation.GenerationOutput; import com.alibaba.dashscope.aigc.generation.G…

移动硬盘打不开怎么办?原因解析!

移动硬盘是一种方便携带、快速传输大量数据的存储设备。但有时我们会遇到这样的问题&#xff1a;插上电脑后&#xff0c;移动硬盘无法打开&#xff0c;出现各种错误提示。这时候我们该怎么办呢&#xff1f; 以下是一些可能导致移动硬盘打不开的原因及解决方法&#xff1a; 1.硬…