バージョン範囲指定は環境によって解決結果が変わる

mise.tomljq = "1.8"のようにバージョン範囲を指定すると、実行環境やタイミングによって解決される具体的なバージョンが変わりうる。【mise】mise use --pinで解決済みのバージョンをmise.tomlに保存する では、--pinmise.toml自体に具体的なバージョンを書き込む方法を紹介した。mise.lockmise.tomlの範囲指定を変更せずに、解決結果だけを別ファイルに記録する仕組みで、mise公式ドキュメントでは--pinよりもこちらが推奨されている。

mise lockコマンドでロックファイルを作成する

jq = "1.8"と書かれたmise.tomlがあるディレクトリでmise lockを実行する。

$ mise lock
→ Targeting 7 platform(s) for /path/to/project/mise.lock: linux-arm64, linux-arm64-musl, linux-x64, linux-x64-musl, macos-arm64, macos-x64, windows-x64
→ Processing 1 tool(s): jq@1.8.2
mise lock            jq@1.8.2 macos-arm64
mise lock          ✓ 7 platform entries
✓ Updated 7 platform entries (0 skipped)
✓ Lockfile written to /path/to/project/mise.lock

mise.lockが生成される(実行した環境以外のプラットフォームは省略)。

lockfile_version = 1

[[tools.jq]]
version = "1.8.2"
backend = "aqua:jqlang/jq"
specifiers = ["1.8"]

[tools.jq."platforms.macos-arm64"]
checksum = "sha256:2d75340ba57a4b4b4c8708a21c2dc8e958a48aaa8bba13b27f77f6e4c0eca07e"
url = "https://github.com/jqlang/jq/releases/download/jq-1.8.2/jq-macos-arm64"
url_api = "https://api.github.com/repos/jqlang/jq/releases/assets/453012783"
provenance = "github-attestations"

[tools.jq."platforms.linux-x64"]
checksum = "sha256:b1c22172dd303f3be49e935aa56aa48a8b7a46e0bc838b4997d3bb451495870f"
url = "https://github.com/jqlang/jq/releases/download/jq-1.8.2/jq-linux-amd64"
url_api = "https://api.github.com/repos/jqlang/jq/releases/assets/453012752"
provenance = "github-attestations"

実行した環境(macOS arm64)向けだけでなく、7プラットフォーム分の解決結果・checksum・ダウンロードURLがまとめて記録される。mise.toml側はjq = "1.8"のまま変更されない。

lockfileがあるとmise installは常にロック済みバージョンを使う

mise.lockが存在する状態でmise installmise useを実行すると、mise.tomlの範囲指定を毎回再解決するのではなく、mise.lockに記録済みのバージョンがそのまま使われる。試しにmise.lockjqのバージョンを1.8.1に書き換えてからmise installを実行する(この時点でまだjq本体はインストールしていない)。

$ mise install jq
mise jq@1.8.1        [1/2] install
mise jq@1.8.1        [1/2] download jq-macos-arm64
mise jq@1.8.1      ✓ installed

mise.tomljq = "1.8"のままで最新は1.8.2だが、--lockedを付けなくてもmise.lockに記録済みの1.8.1がインストールされる。新しいメンバーがリポジトリをクローンした場合も同様に、mise.lockさえコミットされていれば全員が同じバージョンを使える。

mise lock –bumpで範囲指定を再解決する

mise lock(--bumpなし)は、ロック済みバージョンのchecksum・URLといったメタデータを更新するだけで、バージョン自体は変えない。範囲指定に対して新しいバージョンが出ていないか確認し、ロック内容を進めたい場合は--bumpを付ける。

前段でjq@1.8.1をインストール済みの状態のまま--bumpを試すと、インストール済みの実体のバージョンがそのまま使われてしまい、範囲指定の再解決が働かない。

$ mise lock --bump jq
→ Processing 1 tool(s): jq@1.8.1
✓ Updated 7 platform entries (0 skipped)

mise.lock1.8.1のまま更新されない。範囲指定を最新に進めたい場合は、mise uninstall jqで一度実体を削除してから--bumpを実行する。

$ mise uninstall jq
$ mise lock --bump jq
→ Processing 1 tool(s): jq@1.8.2
mise lock            jq@1.8.2 macos-arm64
✓ Pruned 1 stale version entry from /path/to/project/mise.lock: jq@1.8.1
✓ Updated 7 platform entries (0 skipped)

mise.tomljq = "1.8"という範囲指定に対して改めて最新版を解決し、1.8.1から1.8.2に更新された。古い1.8.1のエントリは自動的にmise.lockから削除(prune)される。mise.toml自体は--bumpを付けても書き換わらない。mise use --pinのように既に具体的なバージョンを指定している場合は、その値のまま解決されるため--bumpは影響しない。

–pinとの使い分け

--pinmise.lockはどちらも「解決済みバージョンを固定する」点は同じだが、記録先が異なる。

  • mise use --pin: mise.toml自体を具体的なバージョンで書き換える。1ファイルで完結し、mise.tomlを見ればバージョンが分かる
  • mise.lock: mise.tomlの範囲指定はそのまま維持し、解決結果を別ファイルに記録する。全プラットフォーム分のchecksum・URLも記録されるため、インストール時の改ざん検知にも使える

チームやCIで完全に同じバージョンを使いたい場合は、mise.tomlをリポジトリ間で使い回しつつバージョン管理はmise.lockに任せる方が柔軟である。mise.lockもリポジトリにコミットして運用する。