我正在考虑go1.11rc1,我注意到的第一件事是goland不承认进口。
goland version announcement表示:“支持Go模块(以前称为vgo)”
有人知道怎么解决这个问题吗?
问题:
1.“www.example.com“之类的软件包github.com/urfave/cli被标为红色,并显示以下悬停文本:“无法解析目录...”
1.已导入的软件包项目(如“app:= cli.NewApp()”中的“NewApp”)显示为红色,悬停文本为:“无法解析的引用...”
重现步骤:
1.安装go1.11rc1:删除当前安装,安装1.11rc1,检查版本。
1.在go路径之外创建新的项目目录:mkdir pjg && cd pjg
1.创建go.mod
文件:go mod init github.com/stevetarver/pjg
1.将包添加到项目: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/
中 - 高兰德版本:2018.2.1
- go版本:go1.11rc1达尔文/amd 64
备注:
$GOPATH
设置正确-go get
将软件包放在正确的位置,env中的GOPATH与goland首选项匹配。- 将goland首选项Go -〉GOPATH -〉模块GOPATH设置为
/Users/starver/code/go/pkg/mod
并没有解决这个问题。
4条答案
按热度按时间mbskvtky1#
this site上的答案对我很有效。基本上,通过以下方式在GoLand中启用go模块:
确保在设置(首选项/设置)中启用Go模块集成|开始|Go模块),并且GOPATH索引被禁用(首选项/设置|开始|GOPATH路径|索引整个GOPATH)。
我一这么做,红色进口就消失了,一切都正常了。
ufj5ltwl2#
GoLand支持
GoLand的最新版本实现了对vgo和go模块的支持,但是它还没有跟上go1.11rc1语法的变化。为了在此期间对其他人有所帮助,我将记录我所尝试的东西以及它们的问题和成功。
TL;DR:不要将项目放在
$GOPATH
中并将新项目创建为“Go Module(vgo)”类型,或者为现有项目打开该设置。将go1.11rc1安装为全局
go
后,GoLand中的go mod
项目有三个基本用例...创建新项目inside
$GOPATH
:1.创建类型为“Go Module(vgo)"的新项目:文件-〉新建,选择“Go模块(vgo)”
1.将项目目录设置为
$GOPATH
中的某个目录:$GOPATH/src/github.com/stevetarver/insidegopath
1.创建
main.go
文件,引用$GOPATH
中不存在的软件包。1.将包添加到导入中。
使用
go get
通过vgo
的GoLand方式如gif here中所述:1.点击导入包。
1.单击红色检查灯泡。
1.单击“同步...的软件包"。
1.失败:
go: go mod -sync is now go mod tidy
采用
go get
的GoLand嵌入式终端方式:1.打开嵌入式终端。
go get
您的导入。1.失败:
ᐅ 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.注意:终端插件首选项不提供设置环境变量的方法。
1.设置
GO111MODULE=on
:打开首选项-〉外观和行为-〉路径变量,并添加GO111MODULE=on
。1.退出终端,重试,重新启动GoLand,重试,失败同上。
env | grep GO111MODULE
不会产生任何结果。1.* 注意 *:如果这能起作用,这将是一个糟糕的解决方案- GoLand似乎没有针对每个项目的设置-该变量将为所有项目打开,这将破坏那些没有准备好进入模块的项目。
1.根据this answer,您可以创建一个自定义的命令行启动器来包含这个env var,但是eeuuwww -您如何跟踪何时正常启动GoLand以及何时使用命令行启动器?
您可以在shell init脚本中设置
GO111MODULE=on
,但这会破坏所有尚未使用go模块的项目。您还可以在每个go命令前面加上env var:
export GO111MODULE=on; go get github.com/urfave/cli
或在项目目录中创建一个go
shell脚本 Package 器来执行此操作。创建新项目outside
$GOPATH
:1.创建类型为“Go Module(vgo)"的新项目:文件-〉新建,选择“Go模块(vgo)”
1.将项目目录设置为
$GOPATH
以外的目录1.修复您的
go.mod
:生成的文件包含module "outsidegopath"
,但我们想要类似module github.com/stevetarver/outsidegopath
的文件。这有点不可靠- GoLand将尝试重写go.mod
并删除部分路径。重复几次,它将停止尝试。1.创建您的
main.go
文件。如果您通过ide创建此文件作为go文件,它将包含package outsidegopath
。将其修改为package main
。1.现在,您可以
go get github.com/urfave/cli
,它将按预期提取到$GOPATH/pkg/mod
。将
go mod
支持添加到现有的新项目:事实证明,这非常简单--在GoLand中使用go模块的最佳方式:
1.打开偏好设置:Go -〉Go模块(vgo),并选中“启用Go模块(vgo)集成”
1.工作方式如上所述-但您可以使用
go mod init module-name
创建自己的go.mod
。svgewumm3#
使用Go 1.13(2019年8月),模块管理应该更容易:
GO111MODULE
环境变量继续默认为auto
,但现在只要当前工作目录包含go.mod
文件或位于包含go.mod
文件的目录下,auto
设置就会激活go
命令的模块识别模式-**即使当前目录位于GOPATH/src
**内。这一变化简化了
GOPATH/src
中现有代码的迁移,以及模块感知包与非模块感知导入程序的持续维护。这意味着所有的“不要把你的项目放在
$GOPATH
“部分将不再需要。只要有
go.mod
文件,模块就会被识别,从命令行or from an IDE like Goland。k5ifujac4#
我尝试了下面的方法,它解决了这个问题。主菜单〉文件(菜单)〉无效缓存....选择所有复选框无效和重新启动。重新启动后,允许它同步起来,问题应该得到解决。