ツールのmise.toml をgit clone してcd して.env は
ツールのmise.toml に
mise の
- 第 1 弾:複数言語の
バージョン管理 - 第 2 弾:実行系
(backends、 mise.lock、 mise exec) - 第 3 弾:タスクランナー
(tasks、 mise generate) - 第 4 弾:環境変数管理
(env、 hooks、 secrets。 本記事)
目指すゴールはcd した
環境変数管理:direnv を置き換える
第 1 弾では、[env] にNODE_ENV を
基本はmise.toml に、[env] セクションを
# mise.toml
[env]
NODE_ENV = "development"
DATABASE_URL = "postgres://localhost:5432/mydb_dev"
これだけで、cd でNODE_ENV とDATABASE_URL が.env をsource したり、export を.zshrc に
ここまでだけを[env] にcd eval "$(mise activate zsh)" などのRUN では、cd してもmise exec やmise run にmise env の[env] のcd と
_.(アンダースコア)で
[env]
# .env ファイルを読み込む
_.file = ".env"
# プロジェクトの bin を PATH に追加する(node_modules/.bin など)
_.path = ["./node_modules/.bin", "{{config_root}}/bin"]
# 既存のシェルスクリプトを source して環境を取り込む
_.source = "./scripts/env.sh"
値には{{config_root}} はmise.toml の
Python venv の自動化
Python プロジェクトで
[tools]
python = "3.13"
[env]
_.python.venv = { path = ".venv", create = true } # なければ作って activate
source .venv/bin/activate をsettings のpython.uv_venv_auto を
hooks:決まったタイミングにコマンドを仕込む
決まった[hooks] セクションです。
| フック | 発火タイミング |
|---|---|
enter |
プロジェクトに入ったとき(1 回だけ) |
leave |
プロジェクトから出たとき |
cd |
ディレクトリを移動するたび(プロジェクト内のサブディレクトリ移動も含む) |
watch_files |
指定したファイルが変更されたとき |
preinstall |
mise install によるツールインストールの直前 |
postinstall |
mise install によるツールインストールの直後 |
[hooks]
enter = "mise install --quiet" # プロジェクトに入ったら不足ツールを自動インストール
leave = "echo 'bye'" # プロジェクトから出たとき
preinstall = "echo 'installing...'"
postinstall = "pnpm install" # mise install の後に依存もまとめて揃える
定番はenter = "mise install --quiet" です。cd したmise.toml にpostinstall にpnpm install やpdm sync を
シェル統合が必要なフックと、不要なフック
チームでenter やpostinstall の
前提をcd したかを、[env] はcd だけで
答えは、eval "$(mise activate zsh)" は、mise.toml が[env] の
enter / leave / cd / watch_files は、mise activate をRUN、
一方、preinstall / postinstall はmise install とmise install(やjdx/mise-action)を
使い分けの指針
この
- どの
環境でも (走らせたい セットアップ処理 pnpm installやpdm syncなど)はpostinstallに置きます。 ローカルでは enter = "mise install --quiet"経由で、CI では mise install一発で、同じ セットアップが 再現されます。 enterにすべてを 書いてしまうと、 CI では 何も 起きません。 - 対話シェルでだけ意味の
ある (メッセージ表示や処理 venv の deactivate など)は enter/leaveに置きます。 postinstallは「インストールすべき ものが 何も なかった 場合でも 実行される」と 公式に 明記されています。 pnpm installのような、再実行しても 安全な 冪等の 処理に しておくのが 無難です。
なenter とcd のenter はcd を
watch_files だけは[hooks] の[[watch_files]] と
[[watch_files]]
patterns = ["uv.lock"]
run = "uv sync"
secrets 管理:sops 統合と fnox
環境変数の
sops による暗号化ファイルの読み込み(experimental)
sops(設定ファイル内の.env.json をmise use -g sops age)で
ただし、mise settings set experimental=true で
# age の鍵を作成し、公開鍵で .env.json を暗号化
age-keygen -o ~/.config/mise/age.txt
sops encrypt -i --age "<public key>" .env.json
[env]
_.file = { path = ".env.json", redact = true }
暗号化済みファイルは~/.config/mise/age.txt)をredact = true をmise env --redacted などのmise.toml 内にmise set --age-encrypt API_KEY=secret と
redactions:マスク対象をパターンでまとめて宣言する
redact = true をmise.toml の[env] や[tasks] よりredactions と
# mise.toml(ファイル先頭のトップレベルに書く)
redactions = ["API_KEY", "SECRETS_*"]
[env]
SECRET_KEY = "sensitive_value"
API_TOKEN = "token_123"
パターンにmise run の[redacted] にjdx/mise-action をredact = true やredactions パターンに::add-mask:: を
実務的には、*_TOKEN / *_SECRET / *_KEY のようなredactions に
注意点はraw = true(stdin/stdout 直結モード)でraw モードでtrue や1 のような*KEY* のような*_API_KEY のような
fnox:公式が推奨する専用ツール
公式ドキュメントはfnox.toml を
mise use -g fnox # fnox 自体を mise で入れる
fnox init
fnox set DATABASE_URL "postgresql://localhost/mydb"
fnox exec -- npm start
mise 本体にmise x を[env]、
全部盛りの mise.toml
シリーズをmise.toml は
# mise.toml
[tools]
node = "22"
python = "3.13"
"npm:prettier" = "3"
"cargo:ripgrep" = "14"
[env]
NODE_ENV = "development"
_.file = ".env"
_.path = ["./node_modules/.bin"]
_.python.venv = { path = ".venv", create = true }
[hooks]
enter = "mise install --quiet"
postinstall = "pnpm install"
[tasks.lint]
description = "Lint all sources"
run = "pnpm eslint ."
[tasks.test]
description = "Run tests"
run = "pnpm vitest run"
sources = ["src/**/*", "package.json"]
outputs = { auto = true } # 出力ファイルを列挙する代わりに実行記録でスキップ判定する
[tasks.ci]
description = "Run all checks"
depends = ["lint", "test"]
[settings]
lockfile = true
このcd すれば
シリーズのまとめ
mise を
- タスクランナー(第 3 弾)
:Makefile、 npm scripts、 シェルスクリプト集を 一本化できる。 sources に よる スキップと 並列実行は CI でも 効きます - hooks + env(本記事)
:プロジェクトに 入るだけで 環境が 揃っている 体験 そのもの。 direnv と venv activate を 撤廃できます - backends(第 2 弾)
:言語ランタイム以外の CLI ツールも 宣言的に 管理でき、 チームの ツールチェーン統一が 1 ファイルで 済みます - mise.lock(第 2 弾)
:再現性が 必要な チームや CI では 早めに 有効化しておくと 後で 効いてきます
secrets 周りだけは、