バージョン範囲を指定すると、実行環境によって解決されるバージョンが変わる

mise use jq@1のようにメジャーバージョンだけを指定すると、mise.tomlには範囲を示す文字列がそのまま書き込まれる。この状態でメンバーや実行環境が異なると、mise installで解決する具体的なバージョンも変わる可能性がある。mise use --pinを使うと、実際に解決した具体的なバージョンをmise.tomlに書き込める。

–pinなしでは範囲指定のまま保存される

jq@1のようにメジャーバージョンだけ指定してmise useを実行する。

$ mise use jq@1
mise jq@1.8.2        [1/2] install
mise jq@1.8.2        [1/2] download jq-macos-arm64
mise jq@1.8.2        [2/2] checksum jq-macos-arm64
mise jq@1.8.2        [2/2] extract jq-macos-arm64
mise jq@1.8.2      ✓ installed
mise /path/to/project/mise.toml tools: jq@1.8.2

実行時点の最新である1.8.2がインストールされる。ただしmise.tomlには指定した"1"がそのまま書き込まれる。

[tools]
jq = "1"

この状態でリポジトリをクローンした別のメンバーがmise installを実行すると、その時点で1系の最新バージョンが解決される。jqの1系に新しいマイナーバージョンがリリースされていれば、自分の環境とは異なるバージョンがインストールされる。

–pinで解決済みのバージョンを保存する

mise use --pinを使うと、mise.tomlに書き込む内容が変わる。

$ mise use --pin jq@1
mise jq@1.8.2        [1/2] install
mise jq@1.8.2        [1/2] download jq-macos-arm64
mise jq@1.8.2        [2/2] checksum jq-macos-arm64
mise jq@1.8.2        [2/2] extract jq-macos-arm64
mise jq@1.8.2      ✓ installed
mise /path/to/project/mise.toml tools: jq@1.8.2

mise.tomlには指定した"1"ではなく、実際に解決された"1.8.2"が書き込まれる。

[tools]
jq = "1.8.2"

この状態であれば、リポジトリをクローンした別のメンバーがmise installを実行しても、常に1.8.2がインストールされる。既に具体的なバージョンを指定してmise useを実行する場合、--pinの有無で結果は変わらない。

pinしたバージョンはmise outdatedで更新に気づきにくい

--pinで具体的なバージョンに固定すると、mise outdatedを実行しても新しいバージョンの存在に気づきにくくなる。

$ mise outdated
mise All tools are up to date
mise Newer versions are available outside the configured version ranges. Use `mise outdated --bump` to view them.

jq = "1.8.2"の指定は「1.8.2のみ」の範囲として扱われるため、範囲内では更新がなく「up to date」と表示される。範囲外の新しいバージョンはmise outdated --bumpで確認できる。バージョンをpinしたまま放置すると更新自体に気づけなくなるため、Renovateのmise manager や、mise outdated --bumpを定期的に実行するCIジョブなど、更新を追跡する仕組みと組み合わせるとよい。

mise use –pinを使う場面

mise use --pinは、次のような場面で役立つ。

  • CIやチームメンバー間で、jqのようなツールのバージョンを完全に一致させたい
  • latestやメジャーバージョンのみの指定で運用しつつ、ある時点のバージョンで固定したいタイミングが来た

なお、mise公式ドキュメントでは、バージョンの固定にはmise.tomlへの--pinよりもmise.lockファイルを使う方法が推奨されている。mise.lockmise.tomlのバージョン範囲指定を維持したまま、解決結果だけを別ファイルに記録する仕組みである。