• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

mise

date: 2024-01-11 excerpt: miseの使い方

tag: misedirenvlinuxmacOS


miseの使い方

概要

  • asdfのようなバージョン管理ツール
  • プロジェクトルートの.mise.tomlに記述したソフトウェアを使用する
    • node, python, rust, ruby, deno, bunなどに対応
  • タスクランナーとしても使用可能
  • uv + python venvの組み合わせで高速にPython環境を構築可能

インストール

$ curl https://mise.run | sh

セットアップ

zsh

$ echo 'eval "$(~/.local/bin/mise activate zsh)"' >> ~/.zshrc

引数

  • use : 特定のバージョンのソフトウェアを使用する
  • run : タスクを実行する
  • ls : 使用しているソフトウェアの一覧を表示する
  • ls-remote <tool> : 使用可能なソフトウェアの一覧を表示する
  • install: .mise.tomlに記述されたソフトウェアをインストールする
  • upgrade : インストール済みのソフトウェアをアップグレードする
  • upgrade --bump: .mise.tomlのバージョン指定を最新に更新し、ソフトウェアをアップグレードする
  • tasks : 定義済みタスクの一覧を description 付きで表示する(helpのように使える)

.mise.toml の例

[tools]
uv = "latest"
python = "3.12"  # Pythonバージョンの指定
terraform = "1.6"
awscli = "latest"
gcloud = "latest"

[settings]
python.uv_venv_auto = "create|source"  # uv.lockがあるプロジェクトで.venvを自動作成・有効化

[env]
_.python.venv = { path = ".venv", create = true }  # uvを使わないプロジェクトでvenvを自動作成・有効化

# config_root(mise.tomlが置かれているディレクトリ)を使ったパス解決
CLOUDSDK_CONFIG = "{{config_root}}/.gcloud_config"
GOOGLE_APPLICATION_CREDENTIALS = "{{config_root}}/.gcloud_config/application_default_credentials.json"
GOOGLE_CLOUD_PROJECT = "my-project"

# .envファイルの読み込み
_.file = ".env"

# 複数コマンドを連続実行するタスク("""で複数行記述)
[tasks.build]
description = "Build and push all container images"
run = """
gcloud builds submit services/api \
  --tag region-docker.pkg.dev/my-project/repo/api:latest && \
gcloud builds submit services/worker \
  --tag region-docker.pkg.dev/my-project/repo/worker:latest
"""

# ============================================================
# VM操作
# ============================================================

[tasks.suspend]
description = "Suspend workstation VM"
run = "gcloud compute instances suspend my-vm --zone=asia-northeast1-a --project=my-project"

[tasks.resume]
description = "Resume workstation VM"
run = "gcloud compute instances resume my-vm --zone=asia-northeast1-a --project=my-project"

[tasks.status]
description = "Check workstation VM status"
run = "gcloud compute instances describe my-vm --zone=asia-northeast1-a --project=my-project --format='value(status)'"

mise exec --

mise exec -- <command> は単発コマンドに対して .mise.toml の設定を一時的に有効にして実行する

有効になるもの

  • ツールのPATH(gitleaks, terraform, python等のシム)
  • [env] の環境変数
  • _.file = ".env" で読み込まれる .env ファイル
  • mise tasks のenv継承

サブシェルで実行されるため、コマンド終了後は元の環境に戻る

シチュエーション 推奨
対話シェル(zshrcで mise activate) そのまま command でOK
pre-commit hookなどmise環境を引き継がない場面 mise exec -- command
CI/CD(mise自体は入っている) mise exec -- command
シェルスクリプト内で確実性を上げたい mise exec -- command
mise run <task> の中身 miseが自動でenvを設定するので不要

似た選択肢

  • mise activate — シェルに設定を永続的に注入(対話シェル向け)
  • mise shell — 一時的にシェルセッションに注入
  • mise exec -- — 単発コマンドだけに注入
  • mise run <task> — .mise.toml で定義したタスク実行(env自動)
$ mise exec -- gcloud config list
$ mise exec -- terraform plan
$ mise exec -- bash -c 'echo $GOOGLE_CLOUD_PROJECT'

direnvとの共存

  • .envrc には use mise とだけ記述する
  • 環境変数やツールの管理はすべて .mise.toml の [env] セクションに集約する
  • direnvはmiseの設定を読み込むブリッジとして機能する

.envrc

use mise

参考

  • mise-en-place


misedirenvlinuxmacOS Share Tweet