mise activateの設定を複数のシェル起動ファイルに手で書きたくない

【mise】mise activateでシェルにmiseを組み込む を使うには、eval "$(mise activate bash)"のような行を.bashrc等に自分で追記する必要がある。複数マシンやシェルの組み合わせで同じ設定を揃えたい場合、手作業では抜け漏れが出やすい。mise bootstrap mise-shell-activateは、[bootstrap.mise_shell_activate]の宣言に基づいて、シェルの起動ファイルへの組み込みを冪等に管理するコマンドである。

[bootstrap.mise_shell_activate]の基本

起動ファイルの種類をキーにして、モードを指定する。

[bootstrap.mise_shell_activate]
bashrc = "activate"
bash_profile = "shims"

activatemise activate相当(シェルにmise関数を組み込む)、shimsmise activate --shims相当(PATHにshimsディレクトリを追加するだけの軽量な方式)を意味する。対応するキーはbashrc/bash_profile(bash)、zshrc/zprofile/zshenv(zsh)、fish(fish)である。

mise bootstrap mise-shell-activate applyで実際に書き込む

applyを実行すると、対象の起動ファイルにマーカーで囲まれた管理ブロックが追記される。

$ mise bootstrap mise-shell-activate apply -y
mise edits: applied ~/.bashrc (block:activate), ~/.bash_profile (block:activate)
$ tail -3 ~/.bashrc
# >>> mise:activate >>> managed by mise — do not edit between markers
eval "$(mise activate bash)"
# <<< mise:activate <<<

$ tail -3 ~/.bash_profile
# >>> mise:activate >>> managed by mise — do not edit between markers
eval "$(mise activate bash --shims)"
# <<< mise:activate <<<

出力の(block:activate)はブロックのマーカー名であり、実際にshimsモードで挿入された.bash_profileでも同じ表記になる。挿入される内容自体はTOMLで指定したmode(activate/shims)に応じて変わる。再実行しても、マーカーの内側だけが更新される冪等な操作である。

$ mise bootstrap mise-shell-activate apply -y
mise edits: all edits are applied

mise bootstrap mise-shell-activate statusで状態を確認する

$ mise bootstrap mise-shell-activate status
bashrc        bash  ~/.bashrc        activate  applied
bash_profile  bash  ~/.bash_profile  shims     applied

--missingを付けると、未適用の項目がある場合に終了コード1を返す。--jsonを付けると構造化された出力を得られる。

$ mise bootstrap mise-shell-activate status --json
{
  "mise_shell_activate": [
    {
      "target": "bashrc",
      "shell": "bash",
      "path": "~/.bashrc",
      "mode": "activate",
      "state": "applied"
    }
  ]
}

bash = true/zsh = trueでまとめて有効化する

bash = true/zsh = trueのようなショートカットを使うと、対応する複数の起動ファイルをデフォルトのモードでまとめて有効化できる。zsh = truezprofile(shims)とzshrc(activate)の両方を有効にする。

[bootstrap.mise_shell_activate]
zsh = true
$ mise bootstrap mise-shell-activate status
zprofile  zsh  ~/.zprofile  shims     missing
zshrc     zsh  ~/.zshrc     activate  missing

プロジェクト単位で一部の項目だけ上書きする

グローバル設定でzsh = trueを宣言していても、プロジェクトのmise.tomlで個別のキーだけfalseにすれば、そのプロジェクトに限って該当ファイルへの組み込みを除外できる。

# ~/.config/mise/config.toml (グローバル)
[bootstrap.mise_shell_activate]
zsh = true
# mise.toml (プロジェクト)
[bootstrap.mise_shell_activate]
zshrc = false
$ mise bootstrap mise-shell-activate status
zprofile  zsh  ~/.zprofile  shims  missing

zprofileはグローバル設定のまま有効な一方、zshrcはプロジェクト側の上書きで対象から外れている。

–dry-runで適用前に確認する

-n(--dry-run)を付けると、実際にはファイルを書き換えずに、どのファイルが編集されるかだけを表示できる。

$ mise bootstrap mise-shell-activate apply --dry-run
edit ~/.bashrc (block:activate)
edit ~/.bash_profile (block:activate)