--- title: "Masonをやめようかな、ま、そんなところです" date: '2023-11-14' isPublished: true lang: 'ja' --- > [!NOTE] > この記事は[Vim 駅伝](https://vim-jp.org/ekiden/)の 11/15 の記事です。 この記事は以下の記事の続きです。 /blog/2023-10-15-zenn-a33de9d64b90d8-ja # TL;DR - Masonの使用をやめました - 代わりにlazy.nvimを悪用して半手動でツールを管理することにしました # はじめに 皆さんはNeovimでMasonを使っていますか? [Mason](https://github.com/williamboman/mason.nvim)は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から移行していこう ## バイナリを落とせば動くもの まずはバイナリを落とせば動くものから考えていきます。 たとえば以下のようなツールがあります。 - [gopls](https://github.com/golang/tools/tree/master/gopls) - [rust-analyzer](https://github.com/rust-lang/rust-analyzer) - [efm-language-server](https://github.com/mattn/efm-langserver) - [actionlint](https://github.com/rhysd/actionlint) - [deno lsp](https://github.com/denoland/deno) 等々 これらは[aqua](https://aquaproj.github.io/)で管理をします。 aquaは`aqua.yaml`に必要なツールを記述しておくと、必要に応じて自動でバイナリを落としてきてくれます。 さらに[renovate](https://github.com/renovatebot/renovate)と連携させることで、定期的にバイナリをアップデートしてくれます。 ## バイナリ管理のできないもの / aquaで管理ができないもの これについては、前回の記事で紹介したように、lazy.nvimを悪用することにします。 ### zls [zls](https://github.com/zigtools/zls)はZigのLSPです。 こちらはバイナリ配布を利用するのが難しいため、手元でビルドする必要があります。 これはlazy.nvimに設定を記述することで、最新版があったら自動でインストールしてくれるようにしました。 https://github.com/ryoppippi/dotfiles/blob/b3af0f006f20c60f12b99196baef7216884755ea/nvim/lua/cli/cli.lua#L9-L26 ### Pyright / Ruff [Pyright](https://github.com/microsoft/pyright)や[Ruff](https://github.com/astral-sh/ruff)はPythonのツールです。 こちらはzlsと違い、Pythonの環境が必要になります。 そのため、これらのツールは[rye](https://rye-up.com/)を使ってプロジェクトを作成し、ツールの管理自体は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](https://bun.sh/)でプロジェクトを作成し、ツールの管理自体は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が必要かな?