更新供应商库中的文件
我需要对供应商库之一中的文件进行一些更改。
最好的方法是什么?
也许:
1. fork repo
2. make changes
3. update dependencies to use fork
(4.) make pr to original repo
回答
vendor除了临时调试外,我建议不要自己修改目录。相反,通常今天的过程将类似于以下内容。
- 为简单起见,请
vendor在工作时删除现有目录。(稍后您将使用更改重建它。)
$ rm -r ./vendor
- 将上游存储库(或您自己的上游存储库的分支)克隆到本地目录。(请务必阅读上游维护者的许可证、
README和/或贡献指南,以便您了解他们的测试、代码审查等过程!)
$ git clone https://github.com/julian59189/somerepo
作为此步骤的一部分,go.mod如果上游存储库还没有文件,您可能需要添加一个文件。
$ pushd ./somerepo
$ go mod init example.com/somerepo
$ popd
- 向您的文件添加
replace指令以go.mod将依赖项指向 fork。(有关更多详细信息,请参阅针对未发布的模块代码进行开发和测试。)
$ go mod edit -replace example.com/somerepo@someversion=./somerepo
- 在您的本地克隆中进行并测试更改,并将其推送到您的分支。记录提交哈希以备后用。
…
$ go test ./... example.com/somerepo/...
$ pushd ./somerepo
$ git commit -a
$ COMMIT=$(git rev-parse HEAD)
$ git push
$ popd
- 按照上游作者的指示,为更改发送上游 PR。
- (可选)如果您希望 PR 需要一段时间才能合并,此时您可能需要更新
replace指令以指向已发布的分支而不是本地克隆。
$ go mod edit -replace example.com/somerepo@someversion=github.com/julian59189/somerepo@$COMMIT
$ go mod tidy
现在,任何检查您的 repo 并在您的模块中工作的人都将使用固定版本,即使他们重新运行go mod vendor(例如,在不同的模块中选择不相关的修复)。
- (可选)重建本地
vendor目录(如果使用),替换生效,并提交更改。此时,您自己的模块本身已修复,但使用您的模块的任何人都不会看到该修复程序(因为您不是上游模块的权威所有者)。
$ go mod vendor
$ git add go.mod go.sum vendor
$ git commit
- 合并上游 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