Blog logo

JetBrains News

Tutorials 开发工具

Go 模块使用指南

在本博文中,我们将探索如何在新建 Go 项目或现有项目中使用 Go 模块。

首先,从欢迎屏幕选择新项目 (New Project)来新建一个项目。然后选择 Go Modules (vgo) 作为项目类型。

随后,我们可以指定项目位置,现在可以选择 GOPATH 外的路径,可以选择系统中的任意目录。确保 GOROOT 指向 Go SDK,其版本为 1.11 或更高。

虽然可以使用 Go 1.10 和特殊的 vgo 二进制文件,但不推荐这样做,因为 vgo 的更新频率并未达到 Go 的同等水平,在混合版本的 Go 环境中可能存在不可预测的影响。
最后,我们可以使用代理 (Proxy)字段来指定是直接从 Internet (默认设置)下载 Go 模块(或程序包),或者如果您希望将依赖项存储在一个中心位置,以便团队中的每个人都能够在管理更好的环境中访问相同的版本,那么可以指定通过 Athens 或 JFrog 的 Go Registry 这样的代理系统下载。

创建项目后,我们可以看到其中已经包含一个 go.mod 文件。可以将模块名改为更适合我们需要的名字。

例如,我们将把这个示例发布到 github.com/JetBrains/go-samples 下,这样,其他人可以在其代码中使用导入语句 import "github.com/JetBrains/go-samples"

接下来,像以前一样新建一个 Go 文件,因此这里无需任何修改。

可以使用简单应用 (Simple Application) 类型而不是空文件 (Empty File) 来跳过样板部分。

写完简单的 HelloWorld 函数后,假设我们希望使用流行的 github.com/pkg/errors 程序包来处理代码中的错误。如果要导入该依赖项,那么使用导入语句 import "github.com/pkg/errors",然后对其使用 Sync packages of github.com/JetBrains/go-samples 快速修复。

这样将运行所需的 Go 命令来下载并安装期望的依赖项版本。

github.com/pkg/errors 本文中目前是 0.8.1 版,因此会安装这个版本,因为我们没在 go.mod 文件中指定任何内容。如想使用 0.8.0 版,可以手动编辑 go.mod 文件,这样将会触发刷新依赖项,并使用希望的版本。

如果不想下载两次依赖项,如上所述,那么可以首先编辑 go.mod 文件,然后在其最后一行加上require github.com/pkg/errors v0.8.0,接下来转到 Go 文件并添加导入语句 import "github.com/pkg/errors",并且调用快速修复来下载依赖项。

Go 模块有个名为 replace 的特殊指令来编辑当前项目的依赖项。

这使我们可以用几种不同的方式替换依赖项,最重要的是可以使用该依赖项的本地副本。

关闭当前项目然后回到欢迎屏幕来探索更复杂的示例。

在那里,我们可以执行以下步骤来使用另一个项目 Delve,即 Go 调试器,例如:

  • 从 版本控制 (Version Control) 选项点击 签出 (Check out),然后选择 Git

  • 在 URL 字段填写 https://github.com/go-delve/delve.git,在 目录 (Directory) 字段填写除 GOPATH 以外的任何目录

  • 克隆操作结束后打开项目

  • 转到设置/偏好 (Settings/Preferences) | Go | Go Modules (vgo),确保勾选了 Go 模块 (Go Modules),如果没选,那么选上。

启用 Go 模块支持后,现在可以返回编辑应用程序,并且将库添加到活动编辑器。

为了确保所有依赖项都下载到 Go 的缓存中,可以在内置终端中手动调用 go mod download 命令,或打开任意文件,比如 cmd/dlv/main.go,并且调用 Sync packages of github.com/go-delve/delve

现在,我们使用 URL https://github.com/go-yaml/yaml.git 来克隆 delve 克隆旁边的 gopkg.in/yaml.v2,然后签出在编写本文时 Delve 使用的 v2.2.2 的代码。

在本地安装库之后,我们需要做的是在 go.mod 文件末尾添加一个新指令,告诉 go 命令使用本地版的库而不是缓存的库。

指令类似于: replace gopkg.in/yaml.v2 => d:/yamlv2 

replace 指令的第一个参数是要替换的原始模块,第二个参数是本地文件系统上的模块路径。可以在 Go 模块的 wiki 文档上找到 replace 指令的其他用途。

最后一步是告诉 IDE 加载依赖项,以便与项目一起编辑。

可通过 文件 (File) | 打开 (Open) 工作流来完成,将 IDE 指向依赖项的位置,然后点击确定对话框上的附加 (Attach) 按钮。

现在,我们可以处理主项目及其依赖项。可以点击右键菜单,然后选择从当前项目删除目录 (Remove directory from current project) 选项来分离依赖项,而且在提交主项目的变更前,别忘了从 go.mod 文件删除 replace 指令。

可以在 Go 模块中使用的另一个功能是可视化依赖项关系的映射以及它们如何相互交互。

为了实现这种可视化效果,需要在项目窗口 (Project window) 右键点击 go.mod 文件,然后选择图表 (Diagrams) | 显示图表 (Show Diagram)…

您也许会问到调试部分,这对于任何相当复杂的应用程序都是必不可少的。

我们将在即将发表的关于 IDE 的所有调试功能的文章中介绍这些,敬请关注我们的博客或时事通讯,以便在本文上线时收到通知。

其中包含使用 Go Modules 和 GoLand 的简述。

请通过我们的官方微博和微信告诉我们您对此的看法, 或在YouTrack写下您的反馈或问题。

原文发表于2019年1月22日,作者Florin Pățan

Discover more