バージョン範囲指定は環境によって解決結果が変わる
mise.tomlにjq = "1.8"のようにバージョン範囲を指定すると、実行環境やタイミングによって解決される具体的なバージョンが変わりうる。【mise】mise use --pinで解決済みのバージョンをmise.tomlに保存する
では、--pinでmise.toml自体に具体的なバージョンを書き込む方法を紹介した。mise.lockはmise.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 installやmise useを実行すると、mise.tomlの範囲指定を毎回再解決するのではなく、mise.lockに記録済みのバージョンがそのまま使われる。試しにmise.lockのjqのバージョンを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.tomlはjq = "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.lockは1.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.tomlのjq = "1.8"という範囲指定に対して改めて最新版を解決し、1.8.1から1.8.2に更新された。古い1.8.1のエントリは自動的にmise.lockから削除(prune)される。mise.toml自体は--bumpを付けても書き換わらない。mise use --pinのように既に具体的なバージョンを指定している場合は、その値のまま解決されるため--bumpは影響しない。
–pinとの使い分け
--pinとmise.lockはどちらも「解決済みバージョンを固定する」点は同じだが、記録先が異なる。
mise use --pin:mise.toml自体を具体的なバージョンで書き換える。1ファイルで完結し、mise.tomlを見ればバージョンが分かるmise.lock:mise.tomlの範囲指定はそのまま維持し、解決結果を別ファイルに記録する。全プラットフォーム分のchecksum・URLも記録されるため、インストール時の改ざん検知にも使える
チームやCIで完全に同じバージョンを使いたい場合は、mise.tomlをリポジトリ間で使い回しつつバージョン管理はmise.lockに任せる方が柔軟である。mise.lockもリポジトリにコミットして運用する。
