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 installgithub.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
指令,则不需要更改任何其他导入语句—只需更改给您带来麻烦的语句即可
解决方案的演练
假设您拥有sourcegithub.com/source/s
,并且创建了一个forkgithub.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
指令,则不需要更改任何其他导入语句—只需更改给您带来麻烦的语句即可
解决方案的演练
假设您拥有sourcegithub.com/source/s
,并且创建了一个forkgithub.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。可能是的重复项。您可以这样做吗