0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Miseとdirenvで構築するクリーンな開発環境

0
Posted at

背景

表題の通り、開発をしていくとどうしてもランタイムが乱立しがちで管理が大変です。
miseをつかうと、各プログラミング言語のランタイムバージョン管理やプロジェクトごとの環境変数などを統合的に管理できるというものです。
似たツールでasdfというツールもありますが、miseはRust製ということもあり、実行速度が早いとのことです。

そしてdirenvという別のツールを組み合わせることで、各プロジェクトにcdするだけで指定のバージョンのランタイムを利用できるということでトライしてみました。
ここに手順等を備忘録がてら残しておきます。

miseでバージョンを指定してみる

インストール

シンプルに以下コマンドでインストールできます。
バイナリは ~/.local/bin/mise になります。

curl https://mise.run | sh
echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc

miseには、一時的な実行、グローバル固定、プロジェクト固定の3つのレベルがあります。

  • 一時実行 (exec): インストールせずに最新版を試す
    • mise exec node@22 -- node -v
  • グローバル設定 (use --global): PC全体で使うデフォルトを指定
    • mise use --global node@22 python@3.12

claude-codeのようなツールも、mise経由ならNode.jsの環境を汚さずに実行・管理できます

使い方

mise exec

mise exec ... で指定したツールをシェルから実行できます。

例えば、mise exec python@3 -- python というコマンドを実行すれば、おなじみのPythonのインタラクティブシェルが立ち上がります。
同様の手順でnodeでもいけます。

mise use

そして、mise ues --global ...を実行することで、指定したツールのバージョンがインストール・デフォルト使用できます。

例えば、mise use --global node@24 というコマンドを実行すれば、24のバージョンが使われるので、 mise exec -- node ... コマンドを実行すれば24のバージョンが利用されます。

mise activate

シェルから通常通り (mise関係なしに) コマンドを実行した際に、node 24を実行したい場合は、後述のactivateサブコマンドを使用する必要があります。

mise activate コマンドを使用することで、PATH環境変数が変更され、指定したバージョンのツールが利用できるようになります。

似たコマンドでmise shims コマンドというのもあります。activateはディレクトリ移動時にPATHを動的に書き換えるのに対し、shimsは固定のダミーバイナリを置くという違いがあります。
したがってshimsはCI/CDやIDEに推奨され、通常の利用はactivateが推奨されます。

さて、通常通りnodeと実行したとき、指定したバージョンのnodeが利用されるようにするためにはactivateサブコマンドを実行する必要があります。
冒頭すでに記載済みですが、シェルにbashを使用している場合は以下のコマンドを実行し、シェルが立ち上がるたびにmiseが呼び出されるようにします。

echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc

まとめると、mise use --global ... としておけば指定したツールとバージョンがシェルから実行できるようになるというところです。
たとえばclaude codeを実行する場合、以下の2パターンあります。

  • mise exec npm:@anthropic-ai/claude-code -- claude --version
  • # miseの管理化にnodeが存在していること (以前mise use --global nodeを実行していればOK)
    mise use --global npm:@anthropic-ai/claude-code
    claude --version
    

環境変数の指定

mise.toml ファイルを用意することで、置かれたディレクトリ配下に移動した場合、セットする環境変数を指定できます。

ファイルの例を挙げると以下のとおりです。

mise.toml
[env]
NODE_ENV = "production"

タスク

npm run的なスクリプトの仕組みがmiseにも存在します。

ファイルの例を挙げると以下のとおりです。

mise.toml
[tasks]
hello = "echo hello from mise"

mise run hello を実行すると、hello from mise と表示されます。

direnvを使ってプロジェクトごとにバージョンを指定してみる

direnv と組み合わせることでプロジェクトごとにバージョンを指定できるようになります。

インストール

大体のディストリビューションでパッケージが登録されています。
私が使うFedoraであれば、dnf install direnv でインストールできます。

その後miseのようにシェルから呼び出されるよう設定する必要があります。
Bashの場合は以下のとおりです。

echo 'eval "$(direnv hook bash)"' >> ~/.bashrc

miseと組み合わせた使い方

プロジェクトのルートディレクトリで以下ファイルを作成します。
下の例だとnodeとpythonをインストールするという意味です。
※ファイルを保存したとき、 Config files in xxx are not trusted.というエラーが出ますが、後述のmise trust コマンドを実行するまでセキュリティ上処理しないというメッセージで、現段階では問題ありません。

mise.toml
[tools]
node = "25.7"
python = "3.14"

次にdirenvを使ってmiseを呼び出す設定です。
.envの内容を読み込みたい場合に備え、dotenv_if_existsも使用しています。

.envrc
eval "$(mise env)"
# .env ファイルの内容も読み込みたい場合
dotenv_if_exists .env

ここまで来たら以下のコマンドを実行することで、設定した内容でインストールがされます。
mise trust および direnv allow については、mise.tomlと.envrcの処理を許可するコマンドです。セキュリティ上承認が必要な仕組みとなっています。

mise trust
mise install
direnv allow

なお、特定のディレクトリ配下を常に信頼させるには、グローバル設定(~/.config/mise/config.toml)に以下を追記します。

config.toml
[settings]
trusted_config_paths = ["/tmp"]
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?