我有一个具有多种主要方法的项目。
当运行go build program1/main1.go
的依赖关系与program2/main2.go
不同时,我的第一个go build
似乎会改变我的go.mod
文件并删除它认为的依赖关系不需要。但是main2
需要这些依赖项。
我尝试使用go build ...
,但这也创建了一组不同的依赖关系。具体来说,似乎所有//indirect
依赖项都已删除,并导致program2失败。
是否有一种无需更新go build
文件就能运行go run
或go.mod
的方法?使用go build -mod=readonly program1/main1.go
可以告诉我它失败了,因为需要更新依赖项。
答案 0 :(得分:4)
我相信您正在寻找子模块。参见this walktrhough。
TLDR:在每个工具的go.mod
目录中都需要一个单独的cmd
,并且可以使用replace
指令将这些工具的依赖点指向本地模块。
This Go Issue和其他相关链接表明,尽管我认为您的用例非常简单,但找出“唯一正确的方法”仍是WIP。
答案 1 :(得分:0)
使用子模块是一种嵌套多个 Go 模块项目的方法,您可以编辑。
但 Go 1.18 可能包含 Go 工作区的概念,这意味着您不再需要子模块:一个Go 项目可以包含多个您可以编辑的模块。< /p>
参见 golang/go
issue 45713: "proposal: cmd/go
: add a workspace mode " 及其 design document。
用户通常希望跨多个模块进行更改:例如,在一个模块的包中引入一个新接口,同时在另一个模块中使用该接口。
通常,go
命令会识别用户可以编辑的单个“main
”模块。
其他模块是只读的,从模块缓存中加载。
go mod replace
指令是个例外:它允许用户用磁盘上的工作版本替换模块的解析版本。
但是使用 replace
指令通常很尴尬:每个模块开发人员可能在磁盘上的不同位置都有工作版本,因此将指令放在需要与模块一起分发的文件中并不适合所有用例。
该提案描述了 go
命令中用于编辑多个模块的新工作区模式。
工作目录或包含目录中存在 go.work
文件将使 go
命令进入工作区模式。
go.work
文件指定了一组组成工作区的本地模块。在工作区模式下调用时,go
命令将始终选择这些模块和一组一致的依赖项。
主要模块:用户正在使用的模块。
在此提议之前,这是包含调用 go
命令的目录的单个模块。这个模块作为运行MVS的起点。
该提案提议允许多个主要模块。
参见例如 CL 334934(CL = 更改列表)
<块引用>dev.cmdgo
] cmd/go
:添加工作区模式此更改添加了工作区模式的实现大纲。
go
命令现在将定位 go.work
文件,并读取它们以确定
工作区中有哪些模块。
然后它会在构建构建列表时将这些模块放在工作区的根目录中。
它支持在工作区中构建、运行、测试和列出。
您可以使用 go mod initwork
同样,这不是在 Go 1.18(2022 年第一季度)之前,并且可能会在 Go 1.19(2022 年第三季度)中加入。