我们在开发过程中可能会有这样的需求,使用Go module管理的项目,依赖老旧项目,老旧项目无法升级成go module管理,这个时候有几种方式可以依赖它们。
一、使用replace和vendor
将代码下载到本地,然后编辑go.mod,引用相对路径
require mszlu.com/common v0.0.0-incompatible
replace (
require a.com/common v0.0.0-incompatible // 引入这个包
replace a.com/common => ../common
)
执行go mod tidy和go mod vendor
二、go 1.18之后使用workspace和vendor
将代码下载到本地
go work init go work use ./common
执行go mod tidy和go mod vendor
三、go.mod通过伪版本的方式依赖,不用vendor
将代码下载到本地,在想要的分支下执行如下脚本,就能得到一个伪版本,开发项目go mod可以通过这个版本号去git仓库拉到对应分支的依赖代码,即使依赖库没有go.mod
#!/bin/bash
# 获取当前 Git 提交 ID (12 位)
commit_id=$(git rev-parse --short=12 HEAD)
# 获取指定提交 ID 的提交时间戳
timestamp=$(git show -s --format=%ct $commit_id)
# 减去 8 小时
timestamp=$((timestamp - 28800))
# 生成版本号
version="v0.0.0-$(date -d "@$timestamp" +%Y%m%d%H%M%S)-$commit_id"
echo "Version: $version"
编辑项目的go.mod,直接引用生成的版本号
require a.com/common $version