@ryoppippi

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

14 Nov 2023 ・ 8 min read


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は​とても​便利なのですが、​いく​つか​問題が​あります。

  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が​必要かな?

comment on bluesky / twitter
CC BY-NC-SA 4.0 2022-PRESENT © ryoppippi