Golang 1.16版本中go install的变更解析

Golang 1.16版本中go install的变更解析 在 1.16 版本之前的发行版中,以下操作是可行的。

  1. mkdir -p $(go env GOPATH)/src/mycode/
  2. cd $(go env GOPATH)/src/mycode/
  3. 创建 code.go 文件(空的 main 函数即可)
  4. go install

现在,我得到的不是 $(go env GOPATH)/bin/mycode,而是:

go: cannot find main module; see ‘go help modules’

我尝试了设置 GO111MODULE=autooff,但得到了相同的错误。

我阅读了发行说明,没有看到任何直接相关的内容(不过可能遗漏了什么)。

如果我运行 go mod tidy,然后再运行 go install,它就能正常工作。我理解我们正在转向模块化,但发行说明似乎确实缺少了说明这不再是可选操作的部分(除非我理解错了)。

有什么想法吗?

谢谢。


更多关于Golang 1.16版本中go install的变更解析的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

你好 @petrus,谢谢。

我犯了个错误。我忘记“导出”了。

更多关于Golang 1.16版本中go install的变更解析的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我按照 Go 1.16 发布说明的指引操作。我无法复现您的问题。

Go 1.16 发布说明

模块

模块感知模式现已默认启用,无论当前工作目录或其父目录中是否存在 go.mod 文件。更准确地说,GO111MODULE 环境变量现在默认设置为 on。要切换回之前的行为,请将 GO111MODULE 设置为 auto。

$ dir
main.go
$ cat main.go
package main
func main(){}
$ go1.16 version
go version go1.16 linux/amd64

$ go1.16 env GO111MODULE
on
$ go1.16 install
go: cannot find main module; see 'go help modules'

$ export GO111MODULE=auto && go1.16 env GO111MODULE
auto
$ go1.16 install

$ export GO111MODULE=off && go1.16 env GO111MODULE
off
$ go1.16 install

$ export GO111MODULE=on && go1.16 env GO111MODULE
on
$ go1.16 install
go: cannot find main module; see 'go help modules'

$

从 Go 1.16 开始,go install 的行为确实发生了重要变更,主要与模块感知模式(module-aware mode)的默认启用有关。以下是关键点解析:

1. 模块模式成为默认行为 Go 1.16 中,无论是否在 GOPATH 目录下,只要没有 go.mod 文件,go install 就会报错。这是为了强制推动模块化开发。

2. 解决方案 在你的场景中,需要显式创建模块:

# 进入项目目录
cd $(go env GOPATH)/src/mycode/

# 初始化模块
go mod init mycode

# 然后执行安装
go install

3. 安装特定版本的二进制工具 Go 1.16 还引入了新的 go install 语法来安装特定版本的工具:

# 安装特定版本的工具
go install golang.org/x/tools/gopls@v0.7.0

# 安装最新版本
go install golang.org/x/tools/gopls@latest

4. 向后兼容的变通方案 如果需要在没有 go.mod 的情况下安装,可以使用:

# 临时禁用模块模式
GO111MODULE=off go install

5. 示例代码结构

// code.go
package main

import "fmt"

func main() {
    fmt.Println("Hello from mycode")
}
# 完整操作流程
mkdir -p ~/go/src/mycode
cd ~/go/src/mycode
go mod init mycode
echo 'package main\nimport "fmt"\nfunc main() { fmt.Println("Hello") }' > code.go
go install

这个变更确实在发行说明中有所提及,但可能不够显眼。核心变化是 Go 1.16 默认要求所有 go 命令(包括 install)在模块感知模式下运行,即使项目位于 GOPATH 内。

回到顶部