如何配置goland识别“ mod”包?

时间:2018-08-18 17:02:40

标签: go goland

我正在试用go1.11rc1,我注意到的第一件事是goland无法识别进口。

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

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

问题:

  1. 像“ github.com/urfave/cli”这样的软件包显示为红色,并且悬停文本显示:“无法解析目录...”
  2. 导入的包装项目,如“ app:= cli.NewApp()”中的“ NewApp”,显示为红色,并且悬停文字显示:“未解决的引用...”

复制步骤:

  1. 安装go1.11rc1:删除当前安装,安装1.11rc1,检查版本。
  2. 在转到路径之外创建一个新的项目目录: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,然后将鼠标悬停在红色文本上以查看问题。

  • mod软件包存储在$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不能解决此问题。

3 个答案:

答案 0 :(得分: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. 将该软件包添加到您的导入中。

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

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

使用go get GoLand嵌入式终端方式:

  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:打开“偏好设置”->“外观和行为”->“路径变量”,然后添加GO111MODULE=on
  3. 退出终端,重试,重新启动GoLand,重试,与上述相同。
  4. 终端中的
  5. env | grep GO111MODULE不会产生任何结果。
  6. 注意:如果可以解决,那将是一个糟糕的解决方案-GoLand似乎没有针对每个项目的设置-该变量将在所有项目中均已启用这会破坏那些尚未准备就绪的模块。
  7. 根据this answer,您可以创建一个自定义命令行启动器以包含此环境变量,但是eeuuwww-您如何跟踪何时正常启动GoLand以及何时使用命令行启动器? li>

您可以在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

为{strong>一个现有的新项目添加go mod支持:

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

  1. 打开首选项:转到->转到模块(vgo),然后选中“启用转到模块(vgo)集成”
  2. 如上所述的工作方式-但您可以使用go.mod创建自己的go mod init module-name

答案 1 :(得分:0)

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

  

readonly环境变量继续默认为GO111MODULE,但是auto设置现在会在当前工作目录包含以下任何时候激活auto命令的模块感知模式。 ,或位于包含go文件的目录下-即使当前目录位于go.mod 之内。

     

此更改简化了GOPATH/src中现有代码的迁移,并简化了对具有模块感知能力的软件包以及对非模块感知的进口商的维护。

这意味着将不再需要全部“不要将项目放入GOPATH/src中。”
只要存在$GOPATH文件,就可以从命令行or from an IDE like Goland识别模块。

答案 2 :(得分:0)

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

确保在设置中启用“ Go模块集成”(“首选项/设置| Go | Go模块”),并禁用GOPATH索引编制(“首选项/设置| Go | GOPATH |索引整个GOPATH”)。

我这样做之后,红色的进口就消失了,一切都正常了。