在Go中使用forked包导入

Eri*_*ner 91 go

假设您有一个存储库,github.com/someone/repo并将其分叉github.com/you/repo.你想使用你的fork代替主repo,所以你做了

go get github.com/you/repo
Run Code Online (Sandbox Code Playgroud)

现在,此仓库中的所有导入路径都将"损坏",这意味着,如果存储库中有多个包通过绝对URL相互引用,则它们将引用源,而不是fork.

有没有更好的方法将其手动克隆到正确的路径?

git clone git@github.com:you/repo.git $GOPATH/src/github.com/someone/repo
Run Code Online (Sandbox Code Playgroud)

Iva*_*ave 79

处理拉取请求

  • fork存储库:github.com/someone/repo到github.com/you/repo
  • 得到原始代码: github.com/someone/repo
  • 将遥控器添加到您的仓库: github.com/you/repo
  • 推动你的改变: go get github.com/someone/repo

http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html

在项目中使用包

https://github.com/golang/go/wiki/PackageManagementTools


Shl*_*ach 20

解决问题的一种方法是由Ivan Rave和http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html建议- 分叉的方式.

另一个是解决golang行为.当你go get,golang以与存储库URI中相同的名称布局你的目录,这就是麻烦开始的地方.

相反,如果您自己发布git clone,则可以将存储库克隆到以原始存储库命名的路径上的文件系统上.

假设存在原始存储库github.com/awsome-org/tool并将其分叉github.com/awesome-you/tool,您可以:

cd $GOPATH
mkdir -p {src,bin,pkg}
mkdir -p src/github.com/awesome-org/
cd src/github.com/awesome-org/
git clone git@github.com:awesome-you/tool.git # OR: git clone https://github.com/awesome-you/tool.git
cd tool/
go get ./...
Run Code Online (Sandbox Code Playgroud)

golang非常乐意继续使用这个存储库,并且实际上并不关心某些上层目录awesome-org在git remote是的时候有名字awesome-you.所有导入awesome-org都将通过您刚刚创建的目录进行恢复,这是您的本地工作集.

更详细,请参阅我的博客文章:在GitHub上分叉Golang存储库并管理导入路径

编辑:固定目录路径

  • 我同意这是"最佳"解决方案.但是,在Docker容器中运行Go应用程序时,看到人们如何管理此工作流程真的很棒.我正在学习golang,并希望在创建Pull Request之前测试它时遇到这个令人头痛的问题,为我正在使用的库添加一个小功能. (3认同)

Yog*_*esh 14

如果您正在使用go模块。您可以使用replace指令

replace指令允许您提供另一个导入路径,该路径可能是VCS(GitHub或其他地方)中的另一个模块,或者是具有相对或绝对文件路径的本地文件系统上的另一个模块。replace使用指令中的新导入路径,而无需更新实际源代码中的导入路径。

所以你可以在下面做

module github.com/yogeshlonkar/openapi-to-postman

go 1.12

require (
    github.com/someone/repo v1.20.0
)

replace github.com/someone/repo => github.com/you/repo v3.2.1
Run Code Online (Sandbox Code Playgroud)

仓库v3.2.1中的标签在哪里。也可以通过CLI完成

go mod edit -replace="github.com/someone/repo@v0.0.0=github.com/you/repo@v1.1.1"
Run Code Online (Sandbox Code Playgroud)

  • 很棒。我认为没有更多投票的唯一原因是因为人们还没有使用go模块。我还使用此技巧将文件位置指向工作站上我正在进行本地编辑的另一个目录。一旦在github中推送本地编辑,我就删除“替换”行。 (3认同)
  • 这应该是2019年的正确答案。 (3认同)
  • 哦,但是“主人”对我没有用。我必须在那里编写v0.0.1或某些特定版本。 (2认同)
  • 你也可以直接在命令行上 [`go mod edit -replace`](https://golang.org/cmd/go/#hdr-Edit_go_mod_from_tools_or_scripts): `go mod edit -replace="github.com/someone/ repo@v0.0.0=github.com/you/repo@v1.1.1"`. 两个“@v...”都是可选的。 (2认同)
  • 拥有一个“go.mod.local”或“go.mod.dev”,其作用是实际替换本地开发的导入路径,这不是很酷吗?我的意思是,你永远不会忘记删除丑陋的“替换”,因为你不必这样做。 (2认同)

Nic*_*ood 6

如果您的fork只是临时的(即您打算将其合并),那么只需进行原位开发,例如$GOPATH/src/launchpad.net/goamz.

然后,您可以使用版本控制系统的功能(例如git remote)将上游存储库设置为存储库而不是原始存储库.

这使得其他人更难以使用您的存储库,go get但更容易将其集成到上游.

事实上,我有一个goamz的存储库lp:~nick-craig-wood/goamz/goamz,我正是以这种方式开发的.也许作者有一天会合并它!