模块和导入文件夹的问题
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-Project
而 other-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
应该添加这个)。
我对 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-Project
而 other-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
应该添加这个)。