LoginSignup
70
46

More than 5 years have passed since last update.

VSCodeでGoのModules設定

Last updated at Posted at 2019-02-14

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版は少し様子見のほうが無難かもしれません。

参考

70
46
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
70
46