見出し画像

Rust製ツールのmiseでランタイムバージョンを管理する

アキッパの山下です。

手元の環境を汚さずに、PHP/Python/Node.jsなどのランタイムバージョンを切り替えたいというニーズでは、Dockerの利用がすっかり主流だと思いますが、シーンによってはPythonのvenvといったツールもまだまだ活躍するシーンは多いのではないでしょうか。

そんなツールの中で、今回はRust製ツールのmiseを紹介します。


ランタイムバージョン管理とは?

あらためて、ITシステムやWebサービスを開発・運用していく場合、どのプログラミング言語で構築されているか?だけでなく、そのバージョンは?も重要なポイントです。

稼動しているサーバにインストールされている言語バージョンと、手元の開発環境でバージョンが異なれば、手元で動くのにサーバで動かない(あるいはその逆)が往々にして起こります。

開発環境にサーバと同じバージョンをインストールすれば良いのですが、サーバAで稼動しているのは言語バージョンX、サーバBで稼動しているのは言語バージョンYといった状況では、手元でもそれぞれ異なるバージョンの実行環境が必要です。

そういったケースで、複数のバージョンをインストールして、設定でどのバージョンを利用するか切り替えられるのが、ランタイムバージョン管理の嬉しいところです。

ランタイムバージョン管理ツールの変遷

こういったニーズに対応したツールは数多くありますが、個人的には以下の変遷をたどってきました。

  • venv/pipenv

    • 当時はPythonだけ管理できれば良かったので必要十分

  • 言語ごとの**env(rbenv/nodenvなど)

    • 色んな言語を利用する必要に迫られて導入

    • 1つずつ管理するのがなかなか面倒…

  • anyenv

    • **envを一元管理できるので便利

    • あまり活発に開発されなくなってきた?

  • asdf

    • プラグインがとても充実しているので、もうこれで良いはず

    • タイプが楽

  • rtx/mise

    • Rust好きなので試してみた

    • asdfと完全互換なうえに、速度面でも文句なし

    • 2024年にrtxからmiseに名前が変わった

miseとは?

冒頭で紹介したとおり、Rust言語で実装されたランタイムバージョン管理ツールで、以下のような特徴があります。

実行速度が速い

しっかりとしたベンチマークを取ったわけではないですが、体感レベルでasdfより明らかに速いです。Rustで実装されている点と、後発ツールゆえに既存ツールを研究したうえで開発されている点が大きいのではないでしょうか。

asdfと完全互換

公式ドキュメントで、Core Pluginsとして記載されている対応言語は少なめです。BunDenoといった、比較的新しめのランタイムがサポートされているのもモダンツールならではといったところでしょうか。

ただし、miseで利用できるランタイムは上記にとどまらず、asdfのプラグインという膨大な資産がシームレスに利用できます。

基本的な使い方

インストール

公式ドキュメントで、curl/shの組み合わせに加えて各パッケージマネージャーでのインストール方法も記載されていますから、お好きな方法で良いと思います。せっかくなので cargo を利用しました。

cargo install mise

シェルの設定ファイルに追記する必要がありますが、元々rtxをインストール済みだったので、コマンド名を変更するだけで完了です。

eval "$($HOME/.cargo/bin/mise activate zsh)"

プラグインの確認やインストール

Core Pluginsに記載されている言語やランタイムを利用したい場合は、ここをスルーしていただいて大丈夫です。それ以外の言語・ランタイムを利用したければ、以下のコマンドでどういったものが用意されているのか確認できます。

mise plugin ls-remote
mise plugin ls-remote | wc -l  #=> 735!!

目的の言語・ランタイムが見つかれば、プラグインを追加すればインストールできるようになります。ここでは、Webフロントエンドに特化した言語のElmをインストールしてみます。

mise plugin add elm
mise install elm@latest

コミュニティプラグインをインストールする際は事前に確認されますので、リスクなどはちゃんと理解しておきましょう。

miseでasdfのElmプラグインをインストール

上記ではlatestを明示していますが、省略するとlatestがインストールされます。もちろん、バージョンを細かく指定してインストールも可能ですので、必要に応じて指定します。

mise install elm         #=> 実行時点での最新バージョンをインストール
mise install elm@latest  #=> ↑と同じ

mise install elm@0       #=> 0.x系の最新版をインストール
mise install elm@0.19    #=> 0.19.xの最新版をインストール
mise install elm@0.19.1  #=> 指定されたバージョンをインストール

そもそもどんなバージョンが利用可能なのか?は、先ほど同様に ls-remote を利用します。

mise ls-remote elm
0.16.0
0.17.0
0.17.1
0.18.0
0.19.0
0.19.1

バージョンの切り替え

こういった管理ツールの嬉しいポイントは、ディレクトリ単位で細かくバージョンを切り替えられるところです。試しに別バージョンのElmをインストールして、ディレクトリごとで異なるバージョンを利用してみます。

mise install elm@0.19.0

手元にインストール済みの言語・ランタイムは mise lsで確認できます。

mise ls
Plugin  Version  Config Source Requested
elm     0.19.0
elm     0.19.1

任意のディレクトリで mise use すると、そのディレクトリ下では指定したバージョンが有効になります。

mkdir elm-0.19.0 elm-0.19.1

cd elm-0.19.0
mise use elm@0.19.0
elm --version  #=> 0.19.0

cd ../elm-0.19.1
mise use elm@0.19.1
elm --version  #=> 0.19.1

mise use 実行時にも表示されますが、ディレクトリ直下に作成される .mise.toml によりバージョンの切り替えが行われるメカニズムです。

asdfを利用していた頃は、インストールやディレクトリ内でのバージョン指定後に reshim が必要だったり、reshimしまくっても思ったように有効化されず、という経験が多かったのですが、miseでは全く問題ありません。(そもそも reshim する必要がありません)

もちろん、他ツール同様にグローバル(システムグローバルではなくユーザーグローバル)に利用することも可能です。その場合は -g オプションを付けて use します。

cd elm-0.19.0
elm --version  #=> 0.19.0
mise use -g elm@0.19.1

cd ~/
elm --version  #=> 0.19.1

ユーザーグローバルに指定した場合は、Linux環境であれば ~/.config/mise/config.toml の設定ファイルで管理されます。

アンインストール

不要となったバージョンや言語・ランタイムは uninstall で削除できます。

mise uninstall elm@0.19.0
mise uninstall elm@0.19.1

この場合、.mise.toml や config.toml に記載されているバージョンの面倒は見てくれませんので、適宜メンテナンスしましょう。

まとめ

Rust製ツールのmiseと、その簡単な利用方法を紹介しました。

紹介した以外にも、direnv 同様の環境変数管理ができたり、IDE/エディタとの統合もサポートされていたりと、非常に高機能です。

--help や公式ドキュメントも、非常に充実しており分かりやすいので、興味の湧いた方は是非公式ドキュメントを眺めてみてください。

この記事が気に入ったらサポートをしてみませんか?