tinygo.vimとgopls-lazyが
噛み合わなかった話

tamachi.go #2

Rinrin — @rin2yh

自己紹介

名前 Rinrin
職種 フルスタックエンジニア
趣味 アニメ、ゲーム、キーボード
ひとこと 最寄り駅から田町まで直線距離14.3km

目次

  1. 前提
  2. 起きたこと
  3. 原因の調査
  4. 対応

SECTION 01

前提

tinygo.vimとは

  • TinyGo向けのVim/Neovimプラグイン
  • :TinygoTarget でターゲットに応じた設定を適用
  • GOROOT、GOOS、GOARCH、GOFLAGS をgoplsに設定
  • 設定後にgoplsを再起動

gopls-lazyとは

  • goplsの前段で動作するLSPプロキシ
  • 大規模ワークスペースでの解析負荷を軽減
    • 解析範囲の制御
    • パッケージ情報のキャッシュ

今回の開発環境

  • Neovim + gopls-lazy + tinygo.vim
  • TinyGoでは通常のGoと異なる環境でパッケージを解析する
    • 例:wioterminal では GOOS=linux、GOARCH=arm、TinyGo用の GOROOT を使用
  • .tinygo.json でターゲットを指定
  • dotfiles側で :TinygoTarget を自動実行
{
  "target": "wioterminal"
}

SECTION 02

起きたこと

NeovimでTinyGoのパッケージを解決できない

machine のパッケージ解決を比較

TinyGoの環境を揃えて、実行方法ごとに比較

検証方法 machine の解決
gopls 成功
gopls-lazy経由(v0.4.1) 失敗

→ gopls-lazyを経由した場合にのみ失敗

SECTION 03

原因の調査

仮説①:gopls-lazyがTinyGoの環境変数を引き継いでいない

検証:gopls-lazyと、そこから起動されたgoplsの環境変数を確認

プロセス GOROOT GOOS GOARCH GOFLAGS
gopls-lazy TinyGo用 linux arm wioterminal用
gopls TinyGo用 linux arm wioterminal用

結果:どちらのプロセスにもTinyGoの環境変数が設定されていた

仮説②:キャッシュが再利用されている

検証方法

  • 保存済みの解析結果をコピーした保存先と、空の保存先を用意
  • 比較用Luaスクリプトで vim.lsp.start() の cmd_env.HOME を切り替える
  • 同じTinyGo環境でそれぞれのgopls-lazyを起動して比較

検証結果

起動前のキャッシュ machine の解決
あり 失敗
なし 成功

→ キャッシュの有無がパッケージ解決に影響していた

キャッシュの中身を比較

検証方法

  • キャッシュ内の resp(Base64形式のJSON)をデコード
  • Packages から PkgPath == "machine" の Errors を確認
  • エラー内のパスをTinyGoの GOROOT と照合

検証結果

  • 起動前にキャッシュあり: Go 1.25.14の GOROOT を参照するエラー
  • 起動前にキャッシュなし: 起動後に生成されたキャッシュの Errors は空

→ tinygo.vimの再起動前に作られたキャッシュが、再起動後も使われていた

SECTION 04

対応

TinyGoではgoplsを直接起動

今回はgopls-lazy自体を修正せず、利用側で回避

  • gopls-lazyとTinyGoを併用するケースは少ないと考えた
  • .tinygo.json に target がある場合のみ起動コマンドを変更
対象 修正前 修正後
通常のGo gopls-lazy gopls-lazy
TinyGo gopls-lazy gopls
local cmd = vim.deepcopy(vim.lsp.config.gopls.cmd)
cmd[#cmd] = 'gopls'
vim.lsp.config('gopls', { cmd = cmd })

まとめ

  • TinyGoとgopls-lazyの併用でパッケージ解決に失敗
  • tinygo.vimの再起動前に作られたキャッシュが、再起動後も使われていた
  • TinyGoではgoplsを直接起動して回避

ご清聴いただき、
ありがとうございました

Rinrin — @rin2yh

参考資料

補足:キャッシュの仕組み

保存済みキャッシュを先に返し、必要に応じてバックグラウンドで再検証する

口頭:gopls-lazyはHOME配下にキャッシュを保存するため、NeovimのLSP起動設定`cmd_env`で環境変数`HOME`を変更しました。これによりキャッシュあり・なしの状態を用意し、同じTinyGo環境で比較しました。

口頭:gopls-lazy自体を修正するなら、GOROOTなど解析結果に影響する環境変数をキャッシュの識別条件に含め、異なる環境のキャッシュを使い回さないようにする必要があります。ただ、今回はgopls-lazyを修正せず、TinyGoのときだけgoplsを直接起動して回避しました。