Go get版本锁定后如何参与Golang项目开发
Go get版本锁定后如何参与Golang项目开发
我已经做到了 go get -v -u something 这一步,但有时这个“something”是一个我想参与并贡献的项目。Go 会把源代码放在类似 GOPATH/pkg/mod/something-releaseversion/ 这样的路径下,这显然不是人们当前正在开发的版本。我尝试了“something@latest”,但这只获取了最新的发布版本,而“something@branch”则会移除分支名,并用一个特定时间、特定加密哈希的快照来替换,例如“something@v0.2.2-0.20211008105725-6ed085b1eb77”。一旦我修改了源代码中的一个字母,它就会变成一个新的提交哈希、一个新的时间戳,甚至可能是一个新的版本。那么,我该如何获取能跟上该分支最新版本的“something@branch”呢?其他人可能也正在向该分支贡献代码。
我尝试忽略名称,假装我可以在“something@v0.2.2-0.20211008105725-6ed085b1eb77”内部编辑源代码,但我不知道如何重新构建任何东西。“go get -v -u something@master”只是保留当前已构建的内容,而“go build”则会告诉我类似 cannot find package "go.mindeco.de/log" 这样的错误,尽管在最初的“go get”中它从未拉取过那个包。
我觉得我在这里遗漏了一些非常简单的东西。
更多关于Go get版本锁定后如何参与Golang项目开发的实战教程也可以访问 https://www.itying.com/category-94-b0.html
是否只需克隆您想要处理的项目而不使用“go get”,然后在克隆的目录内运行“go get”?如果您需要处理一个依赖项,但又不希望在确定它在父项目中正常工作之前发布更改,该怎么办?
更多关于Go get版本锁定后如何参与Golang项目开发的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
哦,如果我已经在修改父项目,我可以直接临时更改它的 go.mod 文件,比如…
replace example.com/theirmodule v0.0.0-unpublished => ../theirmodule
…来依赖于我正在亲自处理的任何依赖项。这会把所有那些临时的修改都混入版本历史记录中,但我想至少它可能会起作用。
当您提到参与时,您是指想要在他们的源代码上工作,并在修复错误/添加功能后提交拉取请求吗?如果是这样,我找到了一个页面,这里,我认为它描述了基本流程,但是,无论您试图贡献的特定项目是什么,它们都可能有自己的流程。
哦,当然,我知道怎么用 GitHub 那个“让我们在请别人接受我们帮助的过程中加入供应商锁定”的拉取请求功能。我只是想问,如何让 go 命令获取依赖项并构建项目,同时遵循某个仓库的特定分支?
看起来我必须忽略 go get 命令,而是手动克隆项目,然后在项目目录中,为每个命令运行 go build somewhere/something.go。这样它能获取依赖项并重新编译命令,尽管我必须手动弄清楚哪些文件对应哪些命令。
func main() {
fmt.Println("hello world")
}
要参与Golang项目开发,你需要使用go mod的replace指令或直接在工作区模式下开发。以下是具体方法:
方法一:使用replace指令(推荐)
- 克隆项目到本地开发目录:
git clone https://github.com/owner/something.git
cd something
- 在你的项目中添加replace指令:
在你的
go.mod文件中添加:
module your-project
go 1.21
require (
github.com/owner/something v0.2.2
)
replace github.com/owner/something => /path/to/your/local/something
- 进行开发:
# 在本地something仓库中修改代码
cd /path/to/your/local/something
# 进行修改...
# 在你的项目中使用
cd /path/to/your/project
go build # 会使用本地修改后的代码
方法二:使用Go工作区(Go 1.18+)
- 创建工作区:
# 初始化工作区
go work init
# 克隆要开发的项目
git clone https://github.com/owner/something.git
# 将项目添加到工作区
go work use ./something
# 将你的主项目也添加到工作区
go work use ./your-project
- 工作区结构:
workspace/
├── go.work
├── something/ # 你要贡献的项目
│ ├── go.mod
│ └── ...
└── your-project/ # 你的项目
├── go.mod
└── ...
go.work文件内容:
go 1.21
use (
./something
./your-project
)
方法三:直接修改vendor目录
如果你使用了vendor:
# 启用vendor模式
go mod vendor
# 修改vendor目录中的代码
vim vendor/github.com/owner/something/file.go
# 构建时会使用vendor中的代码
go build -mod=vendor
实际开发示例
假设你要为github.com/gin-gonic/gin贡献代码:
# 1. 克隆gin到本地
git clone https://github.com/gin-gonic/gin.git ~/dev/gin
cd ~/dev/gin
git checkout master # 切换到开发分支
# 2. 在你的项目go.mod中添加replace
cd ~/projects/myapp
# 编辑go.mod,在最后添加:
# replace github.com/gin-gonic/gin => ~/dev/gin
# 3. 进行开发测试
cd ~/dev/gin
# 修改代码...
go test ./... # 测试gin本身
cd ~/projects/myapp
go run main.go # 测试你的应用是否正常工作
提交贡献的完整流程
# 1. Fork原项目
# 2. 克隆你的fork
git clone https://github.com/yourname/something.git
# 3. 添加上游远程
cd something
git remote add upstream https://github.com/owner/something.git
# 4. 创建特性分支
git checkout -b feature-branch
# 5. 在你的项目中使用本地开发版本
# 在go.mod中添加:replace github.com/owner/something => ../something
# 6. 开发、测试、提交
# 修改代码...
go test ./...
git commit -m "Add new feature"
# 7. 推送到你的fork并创建PR
git push origin feature-branch
这样你就可以在本地开发环境中实时测试修改,同时保持与上游分支同步。使用replace指令或工作区模式可以避免版本锁定问题,让你直接使用本地代码进行开发。

