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

5 回复

不,因为在根项目中没有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包的限制,同时保持代码结构的完整性。

回到顶部