如何使用go模块的内部软件包?

如何使用go模块的内部软件包?,go,shared,go-modules,Go,Shared,Go Modules,我在我的项目中使用go模块。我在内部文件夹中共享了代码 . ├── README.md ├── internal │   └── shared │   ├── request.go │   └── request_test.go └── web ├── README.md └── go └── src └── webservice ├── go.mod ├──

我在我的项目中使用go模块。我在内部文件夹中共享了代码

.
├── README.md
├── internal
│   └── shared
│       ├── request.go
│       └── request_test.go
└── web
    ├── README.md
    └── go
        └── src
            └── webservice
                ├── go.mod
                ├── go.sum
                └── main.go
在使用go模块时,我无法从webservice访问内部/共享。我得到以下错误:

package internal/shared is not in GOROOT (/usr/local/go/src/internal/shared)
从main.go中的webservice导入时:

import "internal/shared"
注意:我正在尝试与上面未列出的另一个mod共享内部/共享


如何解决此问题?

您的
go.mod
内部
web/go/src/webservice
表示此软件包位于与您的
内部/共享
软件包不同的模块中。 当您将
go.mod
go.sum
移动到整个项目的根位置时,它应该会起作用。然后
web/go/src/webservice
internal/shared
包将位于一个
go模块中

这对我很有用:

    .
    ├── go.mod
    ├── go.sum
    ├── internal
    │   └── shared
    │       └── request.go
    │  
    └── web
        └── go
            └── src
                └── webservice
                    └── main.go

在导入
internal/shared
包时,您应该在
main.go
中包含整个
go模块
路径

因此,在您的
main.go
中,导入应该类似于
import“$your go module/internal/shared”


关于内部软件包的更多信息

我最终通过向内部/共享软件包添加go.mod并在webservice中编辑go.mod进行了修复,方法如下:

module webservice

go 1.14

replace example.com/shared => ../../../../internal/shared/

require (
    github.com/gorilla/mux v1.7.4
    github.com/spf13/viper v1.6.3
    github.com/stretchr/testify v1.5.1
    example.com/shared v0.0.0-00010101000000-000000000000
)

example.com/shared v0.0.0-0000101000000-000000000000是由
“go mod init webservice”

生成的。在我的例子中,代码编译得很好,但GoLand IDE无法识别导入。这个问题与描述的一模一样

我正在使用go模块和GOPATH之外的目录。外部依赖关系可以很好地识别,GoLand“找不到”我的项目中的包。

修复方法是勾选设置/首选项->转到->转到模块(vgo)下启用转到模块(vgo)集成的复选框

这里是相同的屏幕截图


internal
不是
webservice
模块的一部分。将
internal
移动到正确的位置,或者将整个项目作为单个模块。代码布局很不寻常,有没有这样的结构原因?