【问题标题】:How do I configure goland to recognize 'mod' packages?如何配置 goland 以识别“mod”包?
【发布时间】:2018-08-18 17:02:40
【问题描述】:

我正在使用 go1.11rc1 进行旋转,我注意到的第一件事是 goland 不识别进口。

goland version announcement 说:“支持开箱即用的 Go 模块(以前称为 vgo)”

有人知道如何解决这个问题吗?

问题:

  1. 诸如“github.com/urfave/cli”之类的包为红色,悬停文本显示:“无法解析目录...”
  2. “app := cli.NewApp()”中的“NewApp”等导入包项目为红色,悬停文本显示:“未解析的引用...”

重现步骤:

  1. 安装go1.11rc1:删除当前安装,安装1.11rc1,检查版本。
  2. 在go路径外新建项目目录:mkdir pjg && cd pjg
  3. 创建go.mod 文件:go mod init github.com/stevetarver/pjg
  4. 在项目中添加一个包:go get github.com/urfave/cli

go.mod 文件现在看起来像:

module github.com/stevetarver/pjg/v1

require github.com/urfave/cli v1.20.0 // indirect

创建main.go:

package main

import (
    "fmt"
    "log"
    "os"

    "github.com/urfave/cli"
)

func main() {
    app := cli.NewApp()
    app.Name = "boom"
    app.Usage = "make an explosive entrance"
    app.Action = func(c *cli.Context) error {
        fmt.Println("boom! I say!")
        return nil
    }

    err := app.Run(os.Args)
    if err != nil {
        log.Fatal(err)
    }
}

在 goland 中查看 main.go,并将鼠标悬停在红色文本上以查看问题。

  • 模组包存储在$GOPATH/pkg/mod/
  • goland 版本:2018.2.1
  • go 版本:go1.11rc1 darwin/amd64

注意事项:

  • $GOPATH 设置正确 - go get 将包放在正确的位置,env 中的 GOPATH 匹配 goland 偏好。
  • 将 goland 偏好设置 Go -> GOPATH -> 模块 GOPATH 设置为 /Users/starver/code/go/pkg/mod 无法解决此问题。

【问题讨论】:

    标签: go goland


    【解决方案1】:

    this site 上的答案对我有用。基本上,通过以下方式在 GoLand 中启用 go 模块:

    确保在设置中启用 Go Modules 集成(Preferences / Settings | Go | Go Modules),并禁用 GOPATH 索引(Preferences / Settings | Go | GOPATH | Index entire GOPATH)。

    我一这样做,红色的导入就消失了,一切正常。

    【讨论】:

    【解决方案2】:

    GoLand 支持

    最新版本的 GoLand 实现了对 vgo 和 go 模块的支持,但它还没有赶上 go1.11rc1 语法的变化。以防万一它在此期间对某人有所帮助,我将记录我尝试过的事情以及他们的问题和成功。

    TL;DR:不要将您的项目放在 $GOPATH 中并将您的新项目创建为“Go Module (vgo)”类型,或者为现有项目启用该设置。

    将 go1.11rc1 安装为您的全局 go,GoLand 中的 go mod 项目有三个基本用例...

    在里面创建一个新项目$GOPATH:

    1. 新建一个类型为“Go Module (vgo)”的项目:File -> New,选择“Go Module (vgo)”
    2. 将项目目录设置为 $GOPATH: $GOPATH/src/github.com/stevetarver/insidegopath
    3. 创建您的 main.go 文件,引用您的 $GOPATH 中不存在的包。
    4. 将该包添加到您的导入中。

    通过vgo 使用go get GoLand 方式,如gif here 中所述:

    1. 点击导入包。
    2. 点击红色检查灯泡。
    3. 点击“同步...的包”。
    4. 失败go: go mod -sync is now go mod tidy

    使用go getGoLand嵌入式终端方式:

    1. 打开嵌入式终端。
    2. go get 你的导入。
    3. 失败 ᐅ go get github.com/urfave/cli go get: warning: modules disabled by GO111MODULE=auto in GOPATH/src; ignoring go.mod; see 'go help modules'

    让我们打开该变量并再试一次:

    1. 注意:终端插件首选项无法设置环境变量。
    2. 设置GO111MODULE=on:打开Preferences -> Appearance & Behavior -> Path Variables,添加GO111MODULE=on
    3. 退出终端,重试,重启GoLand,重试,同样失败。
    4. 终端中的env | grep GO111MODULE 不会产生任何结果。
    5. 注意:如果这可行,那将是一个糟糕的解决方案 - GoLand 似乎没有针对此的每个项目的设置 - 对于所有可能会中断的项目,该变量将被打开那些还没有为 go 模块做好准备的人。
    6. 根据this answer,您可以创建一个自定义命令行启动器来包含此环境变量,但是 eeuuwww - 您将如何跟踪何时正常启动 GoLand 以及何时使用命令行启动器?

    您可以在 shell 初始化脚本中设置 GO111MODULE=on,但这会破坏所有尚未使用 go 模块的项目。

    您还可以在每个 go 命令前加上 env var:export GO111MODULE=on; go get github.com/urfave/cli 或在您的项目目录中创建一个 go shell 脚本包装器来为您执行此操作。

    这些都不是真正可行的解决方案,但 go 模块的部分意义在于逃离可怕的 go 工作区,所以继续阅读,它会变得更好

    在外部创建一个新项目$GOPATH:

    1. 新建一个类型为“Go Module (vgo)”的项目:File -> New,选择“Go Module (vgo)”
    2. 将您的项目目录设置为 $GOPATH 之外的内容
    3. 修复你的go.mod:生成的文件包含module "outsidegopath",但我们想要module github.com/stevetarver/outsidegopath。这有点奇怪 - GoLand 将尝试重写 go.mod 并删除部分路径。重复几次,它就会停止尝试。
    4. 创建您的main.go 文件。如果您通过 ide 作为 go 文件创建它,它将包含 package outsidegopath。将其修复为 package main
    5. 现在您可以go get github.com/urfave/cli 并按预期将其提取到$GOPATH/pkg/mod

    现有的新项目添加go mod支持:

    事实证明这非常简单 - 在 GoLand 中使用 go 模块的最佳方式:

    1. 打开首选项:Go -> Go Module (vgo),勾选“Enable Go Modules (vgo) integration”
    2. 按上述方式工作 - 但您可以使用 go mod init module-name 创建自己的 go.mod

    【讨论】:

    • GoLand 将从 2018.2.2 开始支持 Go 1.11 RC1,在撰写本文时是下周,错误 `go: go mod -sync is now go mod tidy` 将得到修复。
    • 感谢@dlsniper 提供的信息——这是对新 go rc 的快速跟进。注意 - 我是 JetBrains 产品的直言不讳的拥护者,并维护个人所有产品订阅 - 不找错,只是分享以防它对某人有帮助。此前,JetBrains 曾发表意见称,在正式支持新功能之前,他们将等待新的语言版本凝胶化——务实且合理。我认为在支持像这样的重大变化之前可能需要四分之一的时间,并且信息会更持久。
    【解决方案3】:

    The module management 应该更容易使用 Go 1.13(2019 年 8 月):

    GO111MODULE 环境变量继续默认为auto,但auto 设置现在激活go 命令的模块感知模式,只要当前工作目录包含或位于包含以下内容的目录下, go.mod 文件 — 即使当前目录在 GOPATH/src

    此更改简化了 GOPATH/src 中现有代码的迁移以及模块感知包与非模块感知导入器的持续维护。

    这意味着不再需要所有“不要将您的项目放入$GOPATH”部分。
    只要有go.mod 文件,就会从命令行or from an IDE like Goland 识别模块。

    【讨论】:

      猜你喜欢
      • 2020-05-14
      • 2021-09-18
      • 2017-03-18
      • 2020-07-09
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      相关资源
      最近更新 更多