如何在 go 模块中使用内部包?

How to use internal packages with go modules?

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

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

我在使用 go modules 时无法从网络服务访问 internal/shared。我收到以下错误:

package internal/shared is not in GOROOT (/usr/local/go/src/internal/shared)

从 main.go 中的网络服务导入时:

import "internal/shared"

注意:我正在尝试与上面未列出的另一个 mod 分享 internal/shared。

如何解决这个问题?

您的 go.modweb/go/src/webservice 中表示此包与您的 internal/shared 包位于不同的模块中。 当您将 go.modgo.sum 移动到整个项目的根目录时,它应该可以工作。然后 web/go/src/webserviceinternal/shared 包将在一个 go module.

这对我有用:

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

并且在 main.go.

中导入 internal/shared 包时,您应该包括整个 go-module 路径

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

有关内部包的更多信息here

我最终通过将 go.mod 添加到 internal/shared 并使用以下内容在网络服务中编辑 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
)

示例。com/shared v0.0.0-00010101000000-000000000000 由 "go mod init webservice"

生成

就我而言,代码编译正常,但 GoLand IDE 无法识别导入。问题与描述的完全一致 here

I'm using go modules and a directory outside of the GOPATH. External dependencies are recognized just fine, packages inside my projects "cannot be found" by GoLand.

The fix is to tick the checkbox for Enable Go Modules (vgo) integration under Settings/Preference -> Go -> Go Modules (vgo).

Here is the screenshot for the same.

如果您想在 Monorepo 中共享库,我们使用 go mod edit -requirego mod edit -replace 将每个依赖项放入需要共享的每个服务的 go.mod 文件中包。

给出

monorepo/
        |_service-1
                |_api/
                |_main.go
                |_go.mod
                |_go.sum
        |_service-2
                |_api/
                |_main.go
                |_go.mod
                |_go.sum
        |_shared_package_1
                |_helpers.go
                |_go.mod
                |_go.sum
        |_shared_package_2
                |common.go
                |_go.mod
                |_go.sum
cd service-1
go mod edit -require=passage.id/shared_package_1@v0.0.0
go mod edit -replace=passage.id/shared_package_1@v0.0.0=../shared_package_1
go mod edit -require=passage.id/shared_package_2@v0.0.0
go mod edit -replace=passage.id/shared_package_21@v0.0.0=../shared_package_1

完成此操作后,我们能够像使用外部包一样使用 service-1 微服务内的任何这些共享包中声明的任何函数。

参考这个doc