Help us understand the problem. What is going on with this article?

VSCodeでGoのModules設定

VSCodeでGoのModulesがサポートされているという情報を目にしたので設定してみました。
https://github.com/Microsoft/vscode-go/wiki/Go-modules-support-in-Visual-Studio-Code

環境

  • macOS 10.12.4
  • Go 1.11.5
  • Visual Studio Code 1.13.1
  • vscode-go 0.9.2

go mod init, go buildなどでモジュールをすでに配置してある状態から開始します。

Install/Update Tools

コマンドパレットからGo: Install/Update Toolsでツール類をひととおり最新にします。
update_tools.png

cannot find package

ツール類を最新にするだけではパッケージが見つからないので環境変数GO111MODULEを設定します。

settings.json
{
    "go.toolsEnvVars": {"GO111MODULE": "on"},
}

ここまでで設定完了となることもあるようです。まだエラーが出る場合は次へ

permission denied

私の環境ではこのエラーに遭遇しました。

go build golang_org/x/crypto/cryptobyte/asn1: open /usr/local/go/pkg/darwin_amd64/vendor/golang_org/x/crypto/cryptobyte/asn1.a: permission denied

ファイル保存時のビルドでエラーになるようです。
go.buildOnSaveoffにするとエラーは消えますが今度はlintなどが効かなくなってしまうため、以下を設定します。

settings.json
{
    "go.installDependenciesWhenBuilding": false,
}

既知の不具合

以上でおおよそ動くようになると思います。が、モジュールへの定義ジャンプにはまだ不具合があるようです。
https://github.com/Microsoft/vscode-go/issues/2296

1回目のジャンプはOK、2回目以降はジャンプできない
これは私の環境でも再現しました。

追記: go.formatTool

go.formatToolのデフォルト設定goreturnsはModulesに対応していないようなので代わりにgoimportsを設定しておくとよさそうです。
https://github.com/Microsoft/vscode-go/issues/2309

settings.json
{
    "go.formatTool": "goimports",
}

設定変更後Go: Install/Update Tools > goimportsを選択、インストール

#そしておそらく近々goimportsがデフォルトになりそう
https://github.com/Microsoft/vscode-go/pull/2338

追記: go.modが空だと補完されない

新規のプロジェクトでgo mod initして空のgo.modを生成した状態では、$GOPATH/pkg/mod以下にパッケージを配置してあってもコードの補完が効きません。
補完を効かせるためにはあらかじめgo get -u xxxなどでgo.modにrequireの記述を追加しておく必要があります。

追記: Language Serverを使う

コード補完のツールとしてgocodeの代わりにLanguage Serverを使うこともできます。
現時点ではbingoがLanguage Serverの選択肢になります。
Language Serverまわりの設定

settings.json
{
    "go.useLanguageServer": true,
    "go.alternateTools": {
        "go-langserver": "bingo"
    },
    "go.languageServerFlags": [
        "-enhance-signature-help",
        "-trace",
        "-format-style=goimports",
    ],
    "go.languageServerExperimentalFeatures": {
        "format": true,
        "autoComplete": true,
        "rename": true,
        "goToDefinition": true,
        "hover": true,
        "signatureHelp": true,
        "goToTypeDefinition": true,
        "goToImplementation": true,
        "documentSymbols": true,
        "workspaceSymbols": true,
        "findReferences": true
    },
}

bingoをインストール

$ git clone https://github.com/saibing/bingo.git
$ cd bingo
$ GO111MODULE=on go install

vscodeをリロードして反映

使用感

上記設定でコード補完などをためしてみましたが、いろいろ動かない・・・
気づいた点だけ挙げると

  • goimportsが効かない
    formatの設定はfalseにしたほうがよさそう
  • ビルド時にエラーがないはずなのにエラーと指摘されてしまうことがある
    importで別名を使っているとエラーになるような??
  • $GOPATH/pkg/mod以下に同名のパッケージが混在すると片方しか補完されない
    cenk/backoffcenkalti/backoffが混在していてはまりました

安定するまではLanguage Server版は少し様子見のほうが無難かもしれません。

参考

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away