Golang中解决go get安装内部包失败的问题
Golang中解决go get安装内部包失败的问题 我的项目遇到了一个问题。结构如下:
├── cmd
│ └── stuff.go
├── Gopkg.lock
├── Gopkg.toml
├── internal
│ ├── myinternalpackage
│ │ ├── myinternalpackage.go
使用 go build cmd/stuff.go 构建项目时一切正常,但当我需要从我的代码库中获取它时出现了问题:
go get -v github.com/myrepo/myproject/cmd
../../myrepo/myproject/cmd/stuff.go:6:2: use of internal package not allowed
stuff.go 的内容是:
...
import (
"fmt"
"github.com/myrepo/myproject/internal/myinternalpackage" #this is where it errored
)
...
更多关于Golang中解决go get安装内部包失败的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
不,因为在根项目中没有go文件
更多关于Golang中解决go get安装内部包失败的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我的猜测是,github.com/myrepo/myproject 在两个情况下实际上并不相同,例如在字母大小写上存在差异。如果不是这种情况,请向我们展示实际的命令和实际输出,而不是你伪造的占位符。
难道不应该是 go get -v github.com/myrepo/myproject 吗?尝试使用相对路径导入内部包。
// 代码示例保留原文
你说得完全正确,这只是一个简单的拼写错误。我修复了它,将go文件移动到cmd/stuff/main.go,然后执行go get github.com/me/myrepo/stuff,一切就正常工作了。
func main() {
fmt.Println("hello world")
}
在Go语言中,internal目录下的包有特殊的访问限制:只能被位于同一模块根目录下的其他包导入。当使用go get命令从外部获取包时,这个限制会导致导入失败。
问题在于go get试图从外部仓库获取代码时,internal/myinternalpackage被视为一个内部包,不允许从模块外部导入。即使你是在同一个仓库中操作,go get也会强制执行这个规则。
以下是几种解决方案:
方案1:使用Go模块替换(推荐)
在项目的go.mod文件中使用replace指令:
module github.com/myrepo/myproject
go 1.19
replace github.com/myrepo/myproject => ./
require (
github.com/myrepo/myproject v0.0.0
)
然后在项目根目录运行:
go mod tidy
方案2:调整项目结构
将cmd目录移出到单独的模块中,或者重新组织包结构:
├── cmd
│ └── stuff.go
├── internal
│ ├── myinternalpackage
│ │ ├── myinternalpackage.go
├── pkg
│ ├── publicpackage
│ │ ├── publicpackage.go
让cmd/stuff.go通过公共包来访问内部功能:
// pkg/publicpackage/publicpackage.go
package publicpackage
import "github.com/myrepo/myproject/internal/myinternalpackage"
func PublicFunction() {
myinternalpackage.InternalFunction()
}
// cmd/stuff.go
package main
import (
"fmt"
"github.com/myrepo/myproject/pkg/publicpackage"
)
func main() {
publicpackage.PublicFunction()
}
方案3:使用本地开发模式
在开发时,直接在项目目录中工作,而不是使用go get:
# 在项目根目录执行
go build ./cmd
或者使用完整的模块路径:
go build github.com/myrepo/myproject/cmd
方案4:移除internal限制
如果包确实需要被外部访问,考虑将其移出internal目录:
├── cmd
│ └── stuff.go
├── pkg
│ ├── myinternalpackage
│ │ ├── myinternalpackage.go
然后更新导入路径:
import "github.com/myrepo/myproject/pkg/myinternalpackage"
最推荐使用方案1的replace指令,它允许你在本地开发时绕过internal包的限制,同时保持代码结构的完整性。

