【问题标题】:Issues with 'go build' on forked repository分叉存储库上的“go build”问题
【发布时间】:2019-02-20 17:18:35
【问题描述】:

我为 GitHub 存储库(go 代码)构建了一个二进制文件,它工作正常。没有问题。 我分叉了那个 repo,并修改了 HTML 文件中与 GO 代码无关的一行,为新的分叉 repo 构建了二进制文件,但它生成的二进制文件引用了原始 repo 代码,不明白为什么。

我什至使用go clean -i all 命令清理了所有代码,并手动从 $home/go/bin 和 repo 目录中删除了所有已安装的代码、二进制文件,但它仍然引用原始 repo 代码而不是新的分叉代码.


根据 Tobias 建议的解决方案,我执行了以下步骤:

之后,我在那个 repo 目录中执行了go build,但是新的二进制文件仍然引用了旧代码。我什至删除了旧的二进制文件并生成了一个新的。

【问题讨论】:

  • 尝试再次删除二进制文件。并安装在你的 fork 中
  • @TobiasTheel,我已经多次这样做了,找到所有二进制文件并删除。
  • 好的,我不明白你的问题?您想使用 fork 的已安装二进制文件,是吗?如果你删除了旧的并在你的 fork 中进行了安装,那么一切都应该没问题
  • 最后,这个链接帮助了:github.com/inconshreveable/ngrok/issues/…,问题不是一般性的,而是特定于 repo 的。
  • 如果您确实解决了问题,您应该发布自己的答案或接受现有答案。人们不会期望在问题中找到答案。

标签: go


【解决方案1】:

这是 Go 中的一个常见问题。 “基于位置”的引用系统,因此它在“正确”路径中搜索这些文件。如果 go 模块解决了这个问题,我想知道,但至少在不使用 go 模块时,你必须解决它。

你可以解决它

解决方案 1

  1. 下载您 fork 的原始存储库:

去获取http://github.com/awesome-org/tool

  1. 将您的分叉添加为远程

git 远程添加 awesome-you-fork http://github.com/awesome-you/tool

  1. 您必须在原始下载的 repo 的文件夹中进行更改,并在您的 fork 中进行推送和拉取。

git pull --rebase awesome-you-fork

git push awesome-you-fork

解决方案 2

解决方法去获取: 您创建原始 repo 的路径,但将您自己的 fork 克隆到其中。这样你就可以推和拉你的叉子。这可能是更好的解决方案

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 ./...

这些解决方案在这里找到:http://code.openark.org/blog/development/forking-golang-repositories-on-github-and-managing-the-import-path

【讨论】:

  • 感谢您的快速响应,但两种解决方案都对我不起作用。
  • 但是它们应该可以工作。在我使用 go 的时间里,我已经成功地使用了两者。您可以编辑您的问题并提供您已经尝试过的内容吗?也许我们可以发现错误
  • 我刚刚使用了第二种解决方案,非常适合我
【解决方案2】:

一个 go 包的分叉副本的问题是,当一个包实际上是一个 repo 中的多个 go 包时,导入语句引用原始基础 repo,即:github.com/orig/repo

对于只有一个 go 包的 repos 来说,这不是问题,因为它从不引用自身。

但如果有多个,即:package github.com/orig/repo/A imports github.com/orig/repo/B

然后你将它分叉为:github.com/fork/repo

然后当 go 编译器在源代码中看到 import "github.com/orig/repo/B" 时,它会去下载原始版本而不是你的 fork。

幸运的是,go modules 解决了这个问题。

基本上,在您的分叉仓库顶部创建一个go.mod 并添加: module github.com/orig/repo

然后,go 编译器将假定您是“orig/repo”,无论您实际从哪里签出。

所以,当orig/repo/A 导入orig/repo/B 时,它会在本地查找。

如果您需要覆盖主分叉存储库之外的其他导入,您还可以使用 replace 强制依赖来自其他地方

【讨论】:

  • 谢谢,让我试试这些步骤并在明天之前更新您。
  • 这里可能需要一个 GO111MODULE=on
  • 是的,GO111MODULE=on,或者只是把你的代码放在 GOPATH 之外(我就是这么做的)
  • 顺便说一句。这应该是公认的答案,因为使用 go 模块比解决方法更好:)
  • 我必须分享我是 Go 语言的新手,但我确实尝试添加 go.mod 文件,但没有成功,因为原始 repo 确实导入了其他 repo,但不是@的格式987654332@
【解决方案3】:

已解决

起初我以为是 FORK 的问题(这是 Go 语言 repo 的 fork 遇到的常见问题),但事实证明,这是特定于 Repo 的问题。 必须重新安装其中一个依赖库才能使分叉的存储库正常工作,原始存储库文档中没有提到这一点。 最后,这个链接有帮助:https://github.com/inconshreveable/ngrok/issues/181#issuecomment-65646229,问题不是一般性的,而是特定于回购的 我按照上面链接中的以下步骤来解决对 go-bindata 的依赖

go get github.com/jteeuwen/go-bindata
cd $GOPATH/src/github.com/jteeuwen/go-bindata/go-bindata
go build

【讨论】:

    猜你喜欢
    • 2021-11-22
    • 2013-04-18
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 2017-04-05
    • 2016-09-19
    相关资源
    最近更新 更多