Go Module引入非Go Module项目的几种方式

91 阅读1分钟

  我们在开发过程中可能会有这样的需求,使用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