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

5 回复

是否只需克隆您想要处理的项目而不使用“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指令(推荐)

  1. 克隆项目到本地开发目录
git clone https://github.com/owner/something.git
cd something
  1. 在你的项目中添加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
  1. 进行开发
# 在本地something仓库中修改代码
cd /path/to/your/local/something
# 进行修改...

# 在你的项目中使用
cd /path/to/your/project
go build  # 会使用本地修改后的代码

方法二:使用Go工作区(Go 1.18+)

  1. 创建工作区
# 初始化工作区
go work init

# 克隆要开发的项目
git clone https://github.com/owner/something.git

# 将项目添加到工作区
go work use ./something

# 将你的主项目也添加到工作区
go work use ./your-project
  1. 工作区结构
workspace/
├── go.work
├── something/      # 你要贡献的项目
│   ├── go.mod
│   └── ...
└── your-project/   # 你的项目
    ├── go.mod
    └── ...
  1. 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指令或工作区模式可以避免版本锁定问题,让你直接使用本地代码进行开发。

回到顶部