go模块有多种主要方法

时间:2019-02-11 12:04:39

标签: go go-modules

我有一个具有多种主要方法的项目。 当运行go build program1/main1.go的依赖关系与program2/main2.go不同时,我的第一个go build似乎会改变我的go.mod文件并删除它认为的依赖关系不需要。但是main2需要这些依赖项。

我尝试使用go build ...,但这也创建了一组不同的依赖关系。具体来说,似乎所有//indirect依赖项都已删除,并导致program2失败。

是否有一种无需更新go build文件就能运行go rungo.mod的方法?使用go build -mod=readonly program1/main1.go可以告诉我它失败了,因为需要更新依赖项。

2 个答案:

答案 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 年第三季度)中加入。