Go GOFLAGS

这个错误是因为您在启用了 -mod=readonly 标志的情况下尝试导入一些未在您的 go.mod 文件中声明的依赖包。

这个错误表明您的 Go 代码尝试导入以下包:

  • golang.org/x/tools/go/analysis
  • golang.org/x/tools/go/analysis/passes/inspect
  • golang.org/x/tools/go/ast/inspector

但这些包没有在您的 go.mod 文件中定义,而 -mod=readonly 标志阻止了 Go 自动下载和添加这些依赖。

解决方法:

  1. 关闭 readonly 模式并更新依赖

    1
    2
    3
    go get golang.org/x/tools/go/analysis
    go get golang.org/x/tools/go/analysis/passes/inspect
    go get golang.org/x/tools/go/ast/inspector
  2. 或者手动编辑 go.mod 文件,添加这些依赖,然后运行:

    1
    go mod tidy
  3. 如果您必须使用 -mod=readonly 模式(比如在 CI/CD 环境中),您需要先在没有该标志的情况下更新 go.mod 文件,然后再使用该标志构建。

这个问题通常出现在开发 Go 语言静态分析工具或使用这些包构建自定义 linter 时。确保您的 go.mod 文件中包含了所有必要的依赖项。



如何关闭 readonly 模式

关闭 Go 的 readonly 模式很简单,您有以下几种方法可以选择:

  1. 直接运行命令时不使用 -mod=readonly 标志
    如果您是在命令行手动执行命令,只需要去掉 -mod=readonly 参数即可。

  2. 如果在环境变量中设置了该模式,您可以通过以下方式取消:

    1
    unset GOFLAGS

    或者如果您只想移除 readonly 标志但保留其他 GOFLAGS:

    1
    export GOFLAGS=$(echo $GOFLAGS | sed 's/-mod=readonly//')
  3. 对于特定命令临时关闭,可以这样做:

    1
    GOFLAGS="" go get golang.org/x/tools/go/analysis
  4. 在 IDE 或编辑器中,查找 Go 相关的设置,禁用或移除 -mod=readonly 选项。

关闭 readonly 模式后,您可以执行:

1
2
3
4
go get golang.org/x/tools/go/analysis
go get golang.org/x/tools/go/analysis/passes/inspect
go get golang.org/x/tools/go/ast/inspector
go mod tidy

这样会自动下载所需依赖并更新您的 go.mod 文件。完成后,如果需要,您可以再次启用 readonly 模式。




设置为-mod=readonly模式



要将 Go 设置为 -mod=readonly 模式,您可以使用以下几种方法:

  1. 通过环境变量设置

    1
    export GOFLAGS="-mod=readonly"

    这会对所有 Go 命令应用该标志。

  2. 在单个命令中使用

    1
    go [command] -mod=readonly

    例如:

    1
    2
    go build -mod=readonly
    go test -mod=readonly
  3. 在 CI/CD 流程中,添加到您的构建脚本或配置文件中:

    1
    2
    3
    # 例如在 GitHub Actions 中
    env:
    GOFLAGS: "-mod=readonly"
  4. 在 IDE 中配置

    • 在 VSCode 的 settings.json 中添加:
      1
      2
      3
      "go.toolsEnvVars": {
      "GOFLAGS": "-mod=readonly"
      }
    • 在 GoLand 中,在 Preferences > Go > Go Modules 中添加环境变量

-mod=readonly 模式确保 Go 不会自动修改您的 go.mod 文件,这在 CI/CD 环境或团队开发中非常有用,可以防止意外的依赖变更。但请记住,使用此模式时,您需要手动管理依赖,或临时禁用该模式来更新依赖。