🐷

Masonをやめようかな、ま、そんなところです

2023/11/15に公開

この記事は以下の記事の続きです。
https://zenn.dev/vim_jp/articles/a33de9d64b90d8

TL;DR

  • Masonの使用をやめました
  • 代わりにlazy.nvimを悪用して半手動でツールを管理することにしました

はじめに

皆さんはNeovimでMasonを使っていますか?

MasonはNeovimで用いるLSPやformatter、lintなどのツールを管理するためのツールです。
Masonは自動でバイナリを落としてきたり管理してくれたりするので、とても便利です。
また、設定ファイルも最小限で済むので、とても楽に環境を構築することができます。
もしNeovimを始めたてであれば、Masonを使うことをおすすめします。

Masonをやめた理由

Masonはとても便利なのですが、いくつか問題があります。

  1. Masonはlockfileを生成してくれないので、現在どのバージョンを使っているのかわからない
  2. Masonのupdateは手動で行う必要がある(もちろんlazy.nvimではプラグインのアップデートと同時に:MasonUpdateを実行するように設定することもできますが)
  3. 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に設定を記述することで、最新版があったら自動でインストールしてくれるようにしました。

https://github.com/ryoppippi/dotfiles/blob/b3af0f006f20c60f12b99196baef7216884755ea/nvim/lua/cli/cli.lua#L9-L26

Pyright / Ruff

PyrightRuffは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-lspconfigcommandに直接bunxdenoを指定することでツールをインストールすることなく使うことができます。
つまり、node_modulesを管理する必要がなくなります!
自分としても将来的にはこれらを使えたらいいなと思っています。

ですが、今回はこれらの使用を見送りました。
理由としては:

  • Denoのnpm互換はまだ発展途上なため、動かないツールがある
  • BunはDeno以上に互換性はある
  • しかしbunxは一時的なツールを/tmpに落としてくるため、万が一オフライン環境でマシンを再起動した場合にツールが使えなくなる危険性がある

常時インターネットに確実に接続されることが保証されている環境であれば、現時点ではbunxを使うのが一番良いと思います。
しかし、管理の手間から解放されつつも、ある程度はオフラインにキャッシュしてくれるDenoも魅力的ですね。
これらのツールが今後発展していくにつれて、Nodeツールの管理の方法は変わっていくと思います。

まとめ

  • Masonは便利だけど、lockfileがないので管理が難しい
  • 代わりにlazy.nvimを悪用して半手動で管理することにした
  • これでlockfileがあるので、どのバージョンを使っているのかわかる
  • Renovateと組み合わせると定期的にアップデートしてくれる

余談

ところで、lazy.nvimのlockfileはRenovateでアップデートされませんね。
Contributionが必要かな?

Discussion