我对Go导入和模块的工作方式存在一些问题。 我有一个具有以下结构的项目:
My-Project
|- Program 1
|- main.go
|- go.mod
|- Program 2
|- main.go
|- go.mod
|- Support
|- go_file.go
两个程序具有不同的模块“定义”。我需要包括两个程序之间共享的“ Support”文件夹。我尝试过
import "My-Project/Support"
位于Program1的main.go内,但这无法正常工作,因为无法解决支持问题。我该怎么做?
答案 0 :(得分:0)
按照规定,您的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"
Note 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
对于本地开发,您可能还希望/需要每个程序的replace
中的go.mod
指令来使用支持模块的本地工作副本(go mod edit -replace github.com/My-Name/My-Project/Support=../Support
应该添加此指令)。