🐻‍❄️

GolandからVSCodeへの移行

2023/08/01に公開

こんにちは、テラーノベルでサーバーサイドを担当している@manikaです。
テラーノベルのサーバーチームではGoで開発しており、IDEは主にGolandをメインで使用しています。Golandにはもちろんフォーマッタやリンター、リファクタリング等の基本的な機能は備わっており、特に不便もなく(むしろ便利に)使用していました。

ただIDEにありがちなメモリ圧迫や、特によく使用されがちな関数名(Get等)をリファクタリングしようとすると多大な時間がかかり最悪そのままハングして強制終了…という事がそこそこの頻度で起きるのでどうにかしたいなぁという事で、チームメンバーもよく使用しているVSCodeに移行出来ないか?という事で移行が出来そうかを調べてみました。

移行をするにしても開発体験が落ちてしまっては元も子もないので移行にあたってこれは欲しいよねという項目をまとめてみました。

MUST

  • GoのLinterがある事
  • Formatterを使用出来ること。Golandでは以下の2つを使用しています。
    • gofumpt
    • gci
  • リファクタリング機能
    • 変数名、定数名、関数名、クラス名等の名称変更
    • 構造体の型名、フィールド名の変更
    • 関数の引数・返り値の追加、削除
    • package名の変更
    • package間のファイル移動
  • 関数等、使用箇所の検索・ジャンプ機能
  • 全ファイル内検索
  • importの自動挿入

そして何よりも動作が軽くなる事!!

Go拡張機能の導入

まずはVSCodeでGoを使用する為の基本的な拡張機能をインストールしていきましょう。

Go

Go: Install/Update tools

Go拡張機能を導入後に、コマンドパレットから「Go: Install/Update tools」を実行します。

表示される全てのツールにチェックを入れてOKでインストールを行います。

以上でVSCodeでGoの開発自体は出来るようになりました。
あとはMUSTの項目を1つずつ検証していきます!

Linter

前述の Go: Install/Update tools のツール内にあった staticcheck がLinterです。
staticcheck のデフォルトの設定を変更したい場合は 開発ディレクトリのルートにstaticcheck.conf を配置するか、settings.json で変更することが可能です。

staticcheckのConfiguration
staticcheckのChecks

Linterについてはこれで問題がなさそうです。

Formatter

gofumpt

gopls をインストールしていれば settings.json に追加すれば適用可能。

"go.useLanguageServer": true,
"gopls": {
    "formatting.gofumpt": true
}
gci

パッケージのインポート順序を整理してくれます。
https://github.com/daixiang0/gci

golangci-lint というリンターを入れればできそうです
golangci-lint は様々なリンターやフォーマッターをまとめて実行してくれるツールのようです。
まずはインストール。

brew install golangci-lint

https://golangci-lint.run/usage/integrations/
settings.json に以下を追加します。

"go.lintTool": "golangci-lint",
"go.lintFlags": [
  "--fast"
]

コンソールで golangci-lint linters を実行するとリンターの一覧が確認できます。

golangci-lint linters

gciはデフォルトでは無効になっているので、使用するために設定を行います。
.golangci.yaml を作成しましょう。

linters:
  disable-all: true
  enable:
    - gci

全てのリンターを disable にして gci のみ有効にしています。
settings.json にコンフィグファイルの場所を指定します。

"go.lintFlags": [
  "--config=${workspaceFolder}/.golangci.yaml",
  "--fast"
]

これでgciが有効になりました。
golangci-lint は様々なリンターを先ほどのコンフィグで設定するのみで使用でき、更に独自リンターも組み込めるようなので使いこなすと便利そう…!公式を見る限りCIにも対応しているようでした。

リファクタリング機能

  • 変数名、定数名、関数名、クラス名等の名称変更
    • デフォルトの機能で可能。
  • 構造体の型名、フィールド名の変更
    • デフォルトの機能で可能。
  • 関数シグネチャー変更
    • 拡張機能も探してみましたが見当たらず、goplsのissue等も確認してみましたが進捗もなくどうやら期待は出来なさそう😢
  • package名の変更
    • デフォルトの機能で可能。
  • package間のファイル移動
  • 関数等、使用箇所の検索・ジャンプ機能
    • デフォルトの機能で可能
  • 全ファイル内検索
    • デフォルトの機能で可能

関数シグネチャーのリファクタリングだけが備わっていない形でした。それ以外はほぼデフォルトの機能で備わっており、且つGolandに比べると高速なのですが…。関数シグネチャーのリファクタリングは使用頻度も高い為それが使えないとなるとなかなか厳しい…。

まとめ

関数シグネチャーのリファクタリング以外は問題無く使えそうでした。そして何より検索やリファクタリング時の速度はGolandと比較するとかなり快適。
ただ関数シグネチャーの変更は実務として意外と頻度が高いのでそれが出来ないというのは中々悩みどころです…。
ただしそれを除けば全体的には動作は軽くなるので用途にマッチしている方や普段からVSCodeを使用している方であれば乗り換えてしまうのはありかなと思いました。

テラーノベル テックブログ

Discussion