更新供应商库中的文件

我需要对供应商库之一中的文件进行一些更改。

最好的方法是什么?

也许:

 1. fork repo
 2. make changes
 3. update dependencies to use fork
 (4.) make pr to original repo

回答

vendor除了临时调试外,我建议不要自己修改目录。相反,通常今天的过程将类似于以下内容。


  1. 为简单起见,请vendor在工作时删除现有目录。(稍后您将使用更改重建它。)
$ rm -r ./vendor

  1. 将上游存储库(或您自己的上游存储库的分支)克隆到本地目录。(请务必阅读上游维护者的许可证、README和/或贡献指南,以便您了解他们的测试、代码审查等过程!)
$ git clone https://github.com/julian59189/somerepo

作为此步骤的一部分,go.mod如果上游存储库还没有文件,您可能需要添加一个文件。

$ pushd ./somerepo
$ go mod init example.com/somerepo
$ popd

  1. 向您的文件添加replace指令以go.mod将依赖项指向 fork。(有关更多详细信息,请参阅针对未发布的模块代码进行开发和测试。)
$ go mod edit -replace example.com/somerepo@someversion=./somerepo

  1. 在您的本地克隆中进行并测试更改,并将其推送到您的分支。记录提交哈希以备后用。
…
$ go test ./... example.com/somerepo/...
$ pushd ./somerepo
$ git commit -a
$ COMMIT=$(git rev-parse HEAD)
$ git push
$ popd

  1. 按照上游作者的指示,为更改发送上游 PR。

  1. (可选)如果您希望 PR 需要一段时间才能合并,此时您可能需要更新replace指令以指向已发布的分支而不是本地克隆。
$ go mod edit -replace example.com/somerepo@someversion=github.com/julian59189/somerepo@$COMMIT
$ go mod tidy

现在,任何检查您的 repo 并在您的模块中工作的人都将使用固定版本,即使他们重新运行go mod vendor(例如,在不同的模块中选择不相关的修复)。


  1. (可选)重建本地vendor目录(如果使用),替换生效,并提交更改。此时,您自己的模块本身已修复,但使用您的模块的任何人都不会看到该修复程序(因为您不是上游模块的权威所有者)。
$ go mod vendor
$ git add go.mod go.sum vendor
$ git commit

  1. 合并上游 PR 后,删除您的replace指令并更新到最新的上游。(如果上游作者尚未标记发布,您可以通过将特定提交哈希传递给而不是使用伪版本;请参阅使用存储库标识符获取特定提交。)go getlatest
$ go mod edit -dropreplace=example.com/somerepo@someversion
$ go get -d example.com/somerepo@latest
$ go mod tidy
$ go mod vendor  # If you want to keep a vendor directory going forward.
$ git add go.mod go.sum vendor
$ git commit


以上是更新供应商库中的文件的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>