Go Modules下如何从不同目录导入本地公共包
方案可行性确认
你期望的目录结构完全可行,这也是Go Modules处理本地公共依赖的标准方案之一,不需要上传代码到公开仓库,完全符合合规要求。
具体配置步骤
1. 配置公共包common-utils
进入common-utils目录初始化Go Modules,模块名可以自定义为公司内部标识(不需要对应真实可访问的线上地址):
go mod init yourcompany.com/common-utils
把所有公共的mongo操作、配置项、结构体等代码迁移到这个目录下即可。
2. 配置各微服务的依赖引用
在每个微服务的go.mod文件中添加两条配置:
- 首先声明对公共包的依赖
- 再通过
replace指令将依赖指向本地的公共包目录
示例如下:
module yourcompany.com/user-ms go 1.19 require yourcompany.com/common-utils v0.0.0 replace yourcompany.com/common-utils => ../common-utils
配置完成后即可在微服务代码中正常导入公共包的内容:
import "yourcompany.com/common-utils/mongo"
3. docker-compose.yml适配配置
因为Docker构建默认只能读取构建上下文目录内的文件,所以需要调整构建配置,让构建过程能访问到同级的common-utils目录,推荐两种方案:
方案1:调整构建上下文(推荐)
将所有服务的构建上下文设置为所有服务和公共包的父目录,示例docker-compose.yml配置:
version: '3.8' services: user-ms: build: context: . # 父目录作为构建上下文,可同时访问user-ms和common-utils dockerfile: ./user-ms/Dockerfile ports: - "8080:8080" # 其他微服务配置同user-ms逻辑
对应微服务的Dockerfile示例(以user-ms为例):
FROM golang:1.19-alpine AS builder WORKDIR /app # 拷贝公共包 COPY ./common-utils ./common-utils # 拷贝当前微服务代码 COPY ./user-ms ./user-ms WORKDIR /app/user-ms RUN go mod download && go build -o main . FROM alpine:3.16 WORKDIR /app COPY --from=builder /app/user-ms/main . CMD ["./main"]
方案2:使用vendor目录
如果不想修改构建上下文,可以在每个微服务本地执行命令将所有依赖打包到vendor目录:
go mod vendor
执行后common-utils的代码会被自动拷贝到当前微服务的vendor目录下,后续Docker构建直接拷贝vendor目录即可,无需额外处理公共包,Dockerfile示例:
FROM golang:1.19-alpine AS builder WORKDIR /app COPY . . RUN go build -mod=vendor -o main . FROM alpine:3.16 WORKDIR /app COPY --from=builder /app/main . CMD ["./main"]
后续扩展建议
如果公司内部有私有Git仓库,可以后续将common-utils推到内部私有仓库,删除各微服务go.mod中的replace指令,直接通过go get yourcompany.com/common-utils拉取依赖,不用上传到公开仓库即可实现跨项目复用。
内容的提问来源于stack exchange,提问作者John Valdetine
相关产品推荐
相关产品推荐

