目录
正确答案
首页 后端开发 Golang 与工作区一起使用时 go build 不起作用

与工作区一起使用时 go build 不起作用

Feb 08, 2024 pm 09:06 PM
go语言

与工作区一起使用时 go build 不起作用

php小编香蕉在这里向大家介绍一个常见的问题,那就是在使用工作区时,go build命令无法正常工作的情况。这个问题可能会让开发者陷入困惑,因为工作区是Go语言中非常重要的一个概念,而无法正常使用go build命令则会严重影响开发进程。在接下来的文章中,我们将深入分析这个问题的原因,并提供解决方案,帮助开发者顺利解决这个困扰。

问题内容

下面是我的 golang 代码的结构,

├── go.work
├── moda
│   ├── go.mod
│   └── main.go
├── go.mod
└── modb
    └── main.go
登录后复制

问题是我只能为单个模块构建二进制文件。对于构建其他模块,只有在我注释掉 go.work 中的其他模块后,它才起作用

我的 go.work 如下,

go 1.19
use (
    ./moda
    .
)
登录后复制

所以当我使用上面的 go.work 进行如下构建时,它工作正常,

go build -o test-binary -modfile ./moda/go.mod ./moda

但是当我尝试为我的其他模块(即 modb/)构建时,如下所示,

go build -o test-binary1 -modfile ./go.mod ./modb

我遇到了以下错误,

directory modb is contained in a module that is not one of the workspace modules listed in go.work. you can add the module to the workspace using go work use .
登录后复制

我尝试使用 go 工作 use 但我仍然面临同样的问题。有人可以帮我解决这个问题吗?

编辑1:

我有一个项目需要多个 go.mod 文件来分离主模块和子模块的依赖关系,就在那时我开始了解非常适合我的用例的 go 工作区。

我的项目结构与上面提到的相同,

├── go.work
├── submodule
│   ├── go.mod
│   ├── go.sum
│   └── main.go
└── mainmodule
    └── main.go
├── go.mod
├── go.sum
登录后复制

现在,当为子模块构建可执行文件时,go build 工作正常,但是当为主模块构建可执行文件时,子模块/go.mod 中存在的导入也会添加到主模块可执行文件中。我也用 go build -n 验证了这一点。

为了避免子模块导入添加到主模块可执行文件中,我使用了 -modfile 但使用它我只能为子模块构建可执行文件,而不能为主模块构建可执行文件。

github源码

ps:虽然我已经在 github 中添加了示例代码,但无法重现相同的问题(子模块导入被添加到主模块)不确定是否是因为我使用的导入所致


正确答案


与@arigatomanga讨论后,我们发现混乱是由工作区中的最小版本选择 (mvs)。工作区是磁盘上的模块集合,在运行最小版本选择(mvs)时用作主模块(参考)。由于 mvs,启用工作区模式构建的模块可以使用与禁用工作区模式构建的模块不同的依赖模块。

这是工作区的记录行为,现在不存在问题。

更新:以下是原始答案,重点关注 -modfile 标志。在 go1.21 的工作空间模式下,该标志将被拒绝。

您在 go 工具中遇到了错误。我刚刚在此处报告了此问题。

go1.20 中的错误消息有所不同,并且仍然具有误导性:

go: module example.com/m1 appears multiple times in workspace
登录后复制

差异是由提交 cmd/go/internal/modload 引入的:重复时返回错误go.work中模块之间的模块路径,但根本原因是相同的:在工作空间模式下,-modfile标志没有被正确处理。

更新:以下部分现在不相关。在了解什么是 mvc 之前,尝试使用 -modfile 标志抑制 mvs 是一次失败的尝试。

在问题报告中,我建议在工作区模式下阻止 -modfile 标志。但你在评论中说你需要这个标志。

使用 -modfile 的原因是如果我为 ./src 构建二进制文件,即使在 ./moda 中存在的模块也会作为 ./src 的原因是如果我为 ./src 构建二进制文件,即使在 ./moda 中存在的模块也会作为 ./src 二进制文件的一部分下载和加载,尽管它们不应该是包括

但是根据cmd/go 文档

-modfile 文件

在模块感知模式下,读取(并可能写入)备用 go.mod 文件而不是模块根目录中的文件。一个名为 “go.mod”必须仍然存在才能确定模块根 目录,但未访问该目录。当指定 -modfile 时, 还使用备用 go.sum 文件:其路径源自 -modfile 标志,通过修剪“.mod”扩展名并附加“.sum”。

-modfile 标志用于替换模块根目录中的 go.mod 标志用于替换模块根目录中的 go.mod 文件。但在您的示例中,您指定了与模块根目录中的文件相同的文件。所以我不太明白。您可以更新您的问题来详细说明这部分吗?演示已被占用!

以上是与工作区一起使用时 go build 不起作用的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Go语言中用于浮点数运算的库有哪些? Go语言中用于浮点数运算的库有哪些? Apr 02, 2025 pm 02:06 PM

Go语言中用于浮点数运算的库介绍在Go语言(也称为Golang)中,进行浮点数的加减乘除运算时,如何确保精度是�...

Go的爬虫Colly中Queue线程的问题是什么? Go的爬虫Colly中Queue线程的问题是什么? Apr 02, 2025 pm 02:09 PM

Go爬虫Colly中的Queue线程问题探讨在使用Go语言的Colly爬虫库时,开发者常常会遇到关于线程和请求队列的问题。�...

Go语言中哪些库是由大公司开发或知名的开源项目提供的? Go语言中哪些库是由大公司开发或知名的开源项目提供的? Apr 02, 2025 pm 04:12 PM

Go语言中哪些库是大公司开发或知名开源项目?在使用Go语言进行编程时,开发者常常会遇到一些常见的需求,�...

在 Go 语言中,为什么使用 Println 和 string() 函数打印字符串会出现不同的效果? 在 Go 语言中,为什么使用 Println 和 string() 函数打印字符串会出现不同的效果? Apr 02, 2025 pm 02:03 PM

Go语言中字符串打印的区别:使用Println与string()函数的效果差异在Go...

Go语言中`var`和`type`关键字定义结构体的区别是什么? Go语言中`var`和`type`关键字定义结构体的区别是什么? Apr 02, 2025 pm 12:57 PM

Go语言中结构体定义的两种方式:var与type关键字的差异Go语言在定义结构体时,经常会看到两种不同的写法:一�...

在使用Go语言和viper库时,为什么传递指针的指针是必要的? 在使用Go语言和viper库时,为什么传递指针的指针是必要的? Apr 02, 2025 pm 04:00 PM

Go指针语法及viper库使用中的寻址问题在使用Go语言进行编程时,理解指针的语法和使用方法至关重要,尤其是在...

在Go语言中使用Redis Stream实现消息队列时,如何解决user_id类型转换问题? 在Go语言中使用Redis Stream实现消息队列时,如何解决user_id类型转换问题? Apr 02, 2025 pm 04:54 PM

Go语言中使用RedisStream实现消息队列时类型转换问题在使用Go语言与Redis...

为什么Go语言中使用for range遍历slice并存入map时,所有值会变成最后一个元素? 为什么Go语言中使用for range遍历slice并存入map时,所有值会变成最后一个元素? Apr 02, 2025 pm 04:09 PM

为什么Go语言中的map迭代会导致所有值变成最后一个元素?在Go语言中,面对一些面试题时,经常会遇到关于map�...

See all articles