Go 由于导入内部包,无法获取要生成的存储库分支

Go 由于导入内部包,无法获取要生成的存储库分支,go,Go,我已经创建了一个存储库分支(特别是),并试图确保在使用该分支进行开发之前能够构建主应用程序(cmd/geth)。但是,由于上游源导入内部包,构建在my fork中不起作用 我用GOPATH和Go模块都试过了。在每种情况下,当我尝试运行go installgithub.com//go ethereum/cmd/geth)时,都会出现以下错误: cmd/geth/main.go:40:2: use of internal package github.com/ethereum/go-ethereum

我已经创建了一个存储库分支(特别是),并试图确保在使用该分支进行开发之前能够构建主应用程序(
cmd/geth
)。但是,由于上游源导入内部包,构建在my fork中不起作用

我用GOPATH和Go模块都试过了。在每种情况下,当我尝试运行go install
github.com//go ethereum/cmd/geth
)时,都会出现以下错误:

cmd/geth/main.go:40:2: use of internal package github.com/ethereum/go-ethereum/internal/debug not allowed
在Go模块方法中,我尝试添加一个替换指令来使用我的fork:

replace github.com/ethereum/go-ethereum => github.com/<me>/go-ethereum master
替换github.com/ethereum/go-ethereum=>github.com//go-ethereum master
但这会导致同样的错误


如果有帮助的话,我很乐意提供更多信息(例如,构建输出),但似乎我遗漏了一些直截了当的东西,与其简单地用
/go-ethereum/internal
替换
以太坊/go-ethereum/internal的所有实例,还不如更改导入路径。

如果要分叉,还应更改导入路径。

默认情况下,GOPATH设置为$HOME/GOPATH,您的存储库源代码位于$GOPATH/github.com/user/repo(或$GOPATH/bitbucket.org/user/repo)中

在处理分叉回购协议时,为了导入内部包,应将原始回购协议的路径添加到


例如,在Travis CI上,在同一个问题上(不允许使用内部包)。所以我刚刚设置了-它通过了。

默认情况下,GOPATH设置为$HOME/GOPATH,您的存储库源代码放置在$GOPATH/github.com/user/repo(或$GOPATH/bitbucket.org/user/repo)中

在处理分叉回购协议时,为了导入内部包,应将原始回购协议的路径添加到

例如,在Travis CI上,在同一个问题上(不允许使用内部包)。所以我只是设置了-它通过了。

问题的根源 事实证明,这个问题与Go模块无关。由于从导入而引发

如何解决 解决此问题的唯一方法是不要对源的
内部
文件夹使用导入语句,而是将其替换为对fork文件夹的导入语句

如果您已经像OP那样使用了
replace
指令,则不需要更改任何其他导入语句—只需更改给您带来麻烦的语句即可

解决方案的演练 假设您拥有source
github.com/source/s
,并且创建了一个fork
github.com/fork/f
,并且在进行更改之前在本地克隆了该fork

叉子的
go.mod
如下所示

module github.com/source/s

go 1.11

require (
...
)
package main

import (
   "github.com/source/s/something"
   "github.com/source/s/internal/somethingelse"
)
...
并假设抛出
内部
错误的文件如下所示

module github.com/source/s

go 1.11

require (
...
)
package main

import (
   "github.com/source/s/something"
   "github.com/source/s/internal/somethingelse"
)
...
添加
替换
指令并更改
模块
指令以镜像您的叉子:

module github.com/fork/f

go 1.11

replace github.com/source/s => github.com/fork/f

require (
...
)
现在运行
go clean-modcache
(清除此模块已导入的任何旧模块)并运行
go mod tidy
。这将使所有内容都安装干净,从而消除可能出现问题的任何其他来源

转到包含问题文件的文件夹,然后运行
Go install
(与OP一样)。您将看到一个错误:

main.go: use of internal package source/s/internal/somethingelse not allowed
只需将有问题的文件内容替换为:

package main

import (
   "github.com/source/s/something"
   "github.com/fork/f/internal/somethingelse"
)
...
然后重新运行
go clean-modcache
go mod tidy

现在,您应该能够运行
go install
而不会出现任何问题,并让
replace
以您想要的方式工作

(就我个人而言,这对我来说是一个非常令人沮丧的问题!我当时正在修改Go生态系统中核心包的一个分支,如果你天真地尝试更改导入路径,那么会破坏的依赖关系的数量之多让我毛骨悚然。我现在能够在晚上安静地睡觉,知道这个问题的答案。)

问题的根源 事实证明,这个问题与Go模块无关。由于从导入而引发

如何解决 解决此问题的唯一方法是不要对源的
内部
文件夹使用导入语句,而是将其替换为对fork文件夹的导入语句

如果您已经像OP那样使用了
replace
指令,则不需要更改任何其他导入语句—只需更改给您带来麻烦的语句即可

解决方案的演练 假设您拥有source
github.com/source/s
,并且创建了一个fork
github.com/fork/f
,并且在进行更改之前在本地克隆了该fork

叉子的
go.mod
如下所示

module github.com/source/s

go 1.11

require (
...
)
package main

import (
   "github.com/source/s/something"
   "github.com/source/s/internal/somethingelse"
)
...
并假设抛出
内部
错误的文件如下所示

module github.com/source/s

go 1.11

require (
...
)
package main

import (
   "github.com/source/s/something"
   "github.com/source/s/internal/somethingelse"
)
...
添加
替换
指令并更改
模块
指令以镜像您的叉子:

module github.com/fork/f

go 1.11

replace github.com/source/s => github.com/fork/f

require (
...
)
现在运行
go clean-modcache
(清除此模块已导入的任何旧模块)并运行
go mod tidy
。这将使所有内容都安装干净,从而消除可能出现问题的任何其他来源

转到包含问题文件的文件夹,然后运行
Go install
(与OP一样)。您将看到一个错误:

main.go: use of internal package source/s/internal/somethingelse not allowed
只需将有问题的文件内容替换为:

package main

import (
   "github.com/source/s/something"
   "github.com/fork/f/internal/somethingelse"
)
...
然后重新运行
go clean-modcache
go mod tidy

现在,您应该能够运行
go install
而不会出现任何问题,并让
replace
以您想要的方式工作


(就我个人而言,这对我来说是一个非常令人沮丧的问题!我当时正在修改Go生态系统中核心包的一个分支,如果你天真地尝试更改导入路径,那么会破坏的依赖关系的数量之多让我毛骨悚然。我现在能够在晚上安静地睡觉,知道这个问题的答案。)

将您的fork克隆到$GOPATH/src/github.com/ethereum/go-ethereum.com。可能是的重复项。您可以这样做吗