Note
この記事はVim 駅伝の 11/15 の記事です。
この記事は以下の記事の続きです。 /blog/2023-10-15-zenn-a33de9d64b90d8-ja
TL;DR
- Masonの使用をやめました
- 代わりにlazy.nvimを悪用して半手動でツールを管理することにしました
はじめに
皆さんはNeovimでMasonを使っていますか?
MasonはNeovimで用いるLSPやformatter、lintなどのツールを管理するためのツールです。 Masonは自動でバイナリを落としてきたり管理してくれたりするので、とても便利です。 また、設定ファイルも最小限で済むので、とても楽に環境を構築することができます。 もしNeovimを始めたてであれば、Masonを使うことをおすすめします。
Masonをやめた理由
Masonはとても便利なのですが、いくつか問題があります。
- Masonはlockfileを生成してくれないので、現在どのバージョンを使っているのかわからない
- Masonのupdateは手動で行う必要がある(もちろんlazy.nvimではプラグインのアップデートと同時に
:MasonUpdateを実行するように設定することもできますが) - Mason経由でバイナリを使うとおかしくなることがある
1の理由については、やはり各ツールのバージョンをGit管理できないことが性に合わないためです。 また、3の理由については過去に記事が上がっています。 https://zenn.dev/kyoh86/articles/67047e3b18139a
というわけで、Masonをやめてどのような管理をするか考えました。
Masonから移行していこう
バイナリを落とせば動くもの
まずはバイナリを落とせば動くものから考えていきます。 たとえば以下のようなツールがあります。
これらはaquaで管理をします。
aquaはaqua.yamlに必要なツールを記述しておくと、必要に応じて自動でバイナリを落としてきてくれます。
さらにrenovateと連携させることで、定期的にバイナリをアップデートしてくれます。
バイナリ管理のできないもの / aquaで管理ができないもの
これについては、前回の記事で紹介したように、lazy.nvimを悪用することにします。
zls
zlsはZigのLSPです。 こちらはバイナリ配布を利用するのが難しいため、手元でビルドする必要があります。 これはlazy.nvimに設定を記述することで、最新版があったら自動でインストールしてくれるようにしました。
Pyright / Ruff
PyrightやRuffはPythonのツールです。 こちらはzlsと違い、Pythonの環境が必要になります。
そのため、これらのツールはryeを使ってプロジェクトを作成し、ツールの管理自体はryeで、アップデート時の更新はlazy.nvimで行うようにしました。
https://github.com/ryoppippi/dotfiles/blob/becc8bb7a5da5a6b731b432070d8d86d06b2aa15/nvim/lua/cli/python_tools/init.lua https://github.com/ryoppippi/dotfiles/blob/22598e3f61bf90d81ae169173dfd5a1db14edc3f/nvim/lua/cli/python_tools/pyproject.toml#L2-L14
Nodeツール
自分はNPMにあるツールを使うことが多いのですが、これらはaquaで管理することができません。 こちらは自分でBunでプロジェクトを作成し、ツールの管理自体はBunで、インストールの操作はlazy.nvimで行うようにしました。 https://github.com/ryoppippi/dotfiles/blob/b3af0f006f20c60f12b99196baef7216884755ea/nvim/lua/cli/node_servers/init.lua https://github.com/ryoppippi/dotfiles/blob/b3af0f006f20c60f12b99196baef7216884755ea/nvim/lua/cli/node_servers/package.json
NodeのツールもPythonのツールもそれぞれlockfileに記述がされているので、どのバージョンを使っているのか一目でわかります。
またこちらもRenovateが定期的にアップデートしてくれるので、定期的にdotfilesをgit pullするだけで最新版を使うことができます。
(Renovateが作ってくれるPRをみているだけでも楽しい)
bunx使わないの? or Deno使わないの?
Bun版のnpxであるbunx、もしくはDenoを使えば、nvim-lspconfigのcommandに直接bunxやdenoを指定することでツールをインストールすることなく使うことができます。
つまり、node_modulesを管理する必要がなくなります!
自分としても将来的にはこれらを使えたらいいなと思っています。
ですが、今回はこれらの使用を見送りました。 理由としては:
- Denoのnpm互換はまだ発展途上なため、動かないツールがある
- BunはDeno以上に互換性はある
- しかし
bunxは一時的なツールを/tmpに落としてくるため、万が一オフライン環境でマシンを再起動した場合にツールが使えなくなる危険性がある
常時インターネットに確実に接続されることが保証されている環境であれば、現時点ではbunxを使うのが一番良いと思います。
しかし、管理の手間から解放されつつも、ある程度はオフラインにキャッシュしてくれるDenoも魅力的ですね。
これらのツールが今後発展していくにつれて、Nodeツールの管理の方法は変わっていくと思います。
まとめ
- Masonは便利だけど、lockfileがないので管理が難しい
- 代わりにlazy.nvimを悪用して半手動で管理することにした
- これでlockfileがあるので、どのバージョンを使っているのかわかる
- Renovateと組み合わせると定期的にアップデートしてくれる
余談
ところで、lazy.nvimのlockfileはRenovateでアップデートされませんね。 Contributionが必要かな?