模块和导入文件夹的问题

Problem with modules and importing folders

我对 Go 导入和模块的工作方式有一些疑问。 我有一个具有这种结构的项目:

My-Project
|- Program 1
   |- main.go
   |- go.mod
|- Program 2
   |- main.go
   |- go.mod
|- Support
   |- go_file.go

这两个程序有不同的模块"definition"。我需要包含两个程序共享的 "Support" 文件夹。我试过了

import "My-Project/Support" 

在 Program1 的 main.go 中,但这不起作用,因为无法解析支持。我该怎么做?

如前所述,您的 Support/go_file.go 不在任何模块中,因此无法使用 Go 模块导入。

要么对所有三个包使用一个模块,要么使用三个单独的模块(即将支持放在它自己的模块中)。您也可以使用子模块。

单模块:

对于单个模块,您可以执行以下操作:

└── My-Project
    ├── go.mod
    ├── Program\ 1
    │   └── main.go
    ├── Program\ 2
    │   └── main.go
    └── Support
        └── go_file.go

项目级别 go.mod 类似于:

module github.com/My-Name/My-Project

(替换为适当的模块名称)然后两个 main 包将导入支持包:

import "github.com/My-Name/My-Project/Support"

注意 Go 包通常不会像这样以大写开头。

对于这种混合包和命令的单个存储库的设置,更惯用的是将命令放入 cmd 子目录的布局(例如,参见 golang.org/x/tools 布局)。这看起来像这样:

└── My-Project
    ├── cmd
    │   ├── program1
    │   │   └── main.go
    │   └── program2
    │       └── main.go
    ├── go.mod
    ├── internal
    │   └── support
    │       └── support.go
    └── other-package
        └── some-other-package.go

这里的 support 包在一个内部子目录中,这使得它不能从外部导入 My-Projectother-package 是任何人都可以导入的。

同样,go.mod 将定义模块名称,它设置用于所有导入语句的前缀。

独立模块:

要使用单独的模块,您需要执行以下操作:

└── My-Project
    ├── Program\ 1
    │   ├── go.mod
    │   └── main.go
    ├── Program\ 2
    │   ├── go.mod
    │   └── main.go
    └── Support
        ├── go_file.go
        └── go.mod

这里 My-Project/Program 1/go.mod 是这样的:

module "github.com/My-Name/My-Project/Program 1"

require (
        github.com/My-Name/My-Project/Support
)

导入与单个模块示例相同。 Program 2 同样如此。对于 Support/go.mod,它看起来像:

module github.com/My-Name/My-Project/Support

对于本地开发,您可能还会 want/need 每个程序 go.mod 中的 replace 指令以使用支持模块的本地工作副本(go mod edit -replace github.com/My-Name/My-Project/Support=../Support 应该添加这个)。