Golang 1.16版本编译变更:"go build"报错问题讨论
Golang 1.16版本编译变更:"go build"报错问题讨论
我有一个简单的应用程序,只有一个 main.go 文件。以前,我只需运行 go build 就能得到一个以目录名命名的二进制文件,这很好。在更新到今天发布的 Go 1.16 版本后,我现在收到这条消息:
go: cannot find main module, but found .git/config in /home/rjzak/go/src/myproj
to create a module there, run:
cd .. && go mod init
我没有在这个项目中使用模块(这其实不算一个项目,只是一组我从 Python 转换到 Go 的简单工具,因为在我看来 Go 更容易管理)。并且 GO111MODULE=on 没有设置,我检查过这一点,因为 Issue 31997 有一个类似的问题,而设置该变量是一个建议的修复方法。我也没有在发布说明中看到任何会影响我使用 go build 的变更。
有什么想法吗?我是不是没有按照“Go 的方式”做事?如果不是,我很乐意了解对于小型应用程序来说理想的做法是什么。
更多关于Golang 1.16版本编译变更:"go build"报错问题讨论的实战教程也可以访问 https://www.itying.com/category-94-b0.html
谢谢,我一定是错过了。
更多关于Golang 1.16版本编译变更:"go build"报错问题讨论的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我在发布说明中也没有看到任何会影响我使用
go build的更改。
Go 1.16 发布说明
模块
模块感知模式现在默认启用,无论当前工作目录或其父目录中是否存在 go.mod 文件。更准确地说,GO111MODULE 环境变量现在默认设置为 on。要切换回之前的行为,请将 GO111MODULE 设置为 auto。
go env GO111MODULE 命令的输出结果是什么?
在 Go 1.16 中,模块模式已成为默认行为,即使 GO111MODULE 未设置。这意味着 go build 现在期望在项目根目录找到 go.mod 文件,否则会报错。对于小型应用程序,建议初始化一个模块。
在你的项目目录中运行:
go mod init myproj
这会在当前目录创建 go.mod 文件,之后 go build 就能正常工作了。
如果你希望保持非模块模式,可以设置 GO111MODULE=off:
export GO111MODULE=off
go build
但这不是推荐做法,因为模块是 Go 依赖管理的标准方式。
对于小型工具,初始化模块是简单且符合 Go 惯例的做法。例如:
cd /home/rjzak/go/src/myproj
go mod init myproj
go build
这样会生成二进制文件,同时 go.mod 文件记录了模块信息。

