<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Mise on マスタカの ChangeLog メモ</title>
    <link>https://masutaka.net/tags/mise/</link>
    <description>Recent content in Mise on マスタカの ChangeLog メモ</description>
    <generator>Hugo</generator>
    <language>ja</language>
    <lastBuildDate>Sat, 30 May 2026 19:18:29 +0900</lastBuildDate>
    <atom:link href="https://masutaka.net/tags/mise/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Codex CLI と Codex.app に mise 管理の Ruby や Node.js を使わせる</title>
      <link>https://masutaka.net/2026-05-30-1/</link>
      <pubDate>Sat, 30 May 2026 19:18:29 +0900</pubDate>
      <guid>https://masutaka.net/2026-05-30-1/</guid>
      <description>&lt;p&gt;私は Claude Code を使うことが多いですが、最近は Codex CLI や Codex.app（以下 Codex）の使用頻度も上がってきました。環境は macOS です。&lt;/p&gt;
&lt;p&gt;しかしながら、&lt;a href=&#34;https://masutaka.net/2026-03-29-1/&#34;&gt;[2026-03-29-1]&lt;/a&gt;
 から &lt;a href=&#34;https://mise.jdx.dev/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;mise&lt;/a&gt;
 を使い始めたところ、Codex 内では mise 管理の Ruby や Node.js 等を使ってくれず、困っていました。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>私は Claude Code を使うことが多いですが、最近は Codex CLI や Codex.app（以下 Codex）の使用頻度も上がってきました。環境は macOS です。</p>
<p>しかしながら、<a href="/2026-03-29-1/">[2026-03-29-1]</a>
 から <a href="https://mise.jdx.dev/" target="_blank" rel="noopener">mise</a>
 を使い始めたところ、Codex 内では mise 管理の Ruby や Node.js 等を使ってくれず、困っていました。</p>
<p>このような状態でした。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ where ruby
</span></span><span style="display:flex;"><span>/usr/bin/ruby
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span>$ ruby --version
</span></span><span style="display:flex;"><span>ruby 2.6.10p210 (2022-04-12 revision 67958) [universal.arm64e-darwin25]
</span></span></code></pre></div><h2 id="対策方法">対策方法</h2>
<p><code>~/.zshenv</code> に以下を設定して、解決しました。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-zsh" data-lang="zsh"><span style="display:flex;"><span><span style="color:#75715e"># Codex CLI と Codex.app のコマンド実行では .zshrc の mise activate zsh が効かないため、</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># mise shims を PATH に追加する。</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> <span style="color:#f92672">[</span> -n <span style="color:#e6db74">&#34;</span>$CODEX_SANDBOX<span style="color:#e6db74">&#34;</span> <span style="color:#f92672">]</span>; <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>  PATH<span style="color:#f92672">=</span><span style="color:#e6db74">${</span>XDG_DATA_HOME<span style="color:#e6db74">}</span>/mise/shims:$PATH
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">fi</span>
</span></span></code></pre></div><p>設定後の Codex 内での状態です。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ where ruby
</span></span><span style="display:flex;"><span>/Users/masutaka/.local/share/mise/shims/ruby
</span></span><span style="display:flex;"><span>/usr/bin/ruby
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span>$ ruby --version
</span></span><span style="display:flex;"><span>ruby 4.0.5 (2026-05-20 revision 64336ffd0e) +PRISM [arm64-darwin25]
</span></span></code></pre></div><h2 id="codex-のコマンド実行環境はサンドボックス">Codex のコマンド実行環境はサンドボックス</h2>
<p>以前から薄々気づいていましたが、Codex のコマンド実行環境はサンドボックス内にあるようです。</p>
<p>Codex 内で、その手がかりを確認できます。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ env | grep CODEX
</span></span><span style="display:flex;"><span>CODEX_CI=1
</span></span><span style="display:flex;"><span>CODEX_SANDBOX=seatbelt
</span></span><span style="display:flex;"><span>CODEX_THREAD_ID=019e7806-6025-7c13-a3c6-a70d41c13905
</span></span></code></pre></div><p>seatbelt というのは Apple Seatbelt のことで、macOS のサンドボックス機構のようです。</p>
<p>&#x1f517; <a href="https://zenn.dev/alesion/articles/37abbfb9f2fa4b" target="_blank" rel="noopener">macOSで手軽にSandbox環境を構築できるApple Seatbeltの実践ガイド</a>
</p>
<blockquote>
<p>しかしながら、Apple Seatbeltは公式にドキュメントを公開されておらず、非推奨とされています。一方で実際には多くのアプリケーションやツールで使用されています。</p>
</blockquote>
<p>なるほど&hellip;。</p>
<p>この記事によると Claude Code でも Apple Seatbelt が採用されているようで、<code>/sandbox</code> で有効化できることを確認しました（<a href="https://code.claude.com/docs/ja/sandboxing" target="_blank" rel="noopener">公式ドキュメント</a>
）。</p>
<p>Claude Code に慣れた身からすると、Codex のサンドボックスは理解が難しいですが、以下の記事に詳しくまとまっています。ありがたい。</p>
<p>&#x1f517; <a href="https://zenn.dev/4br4si0n/articles/8dfed37969e8cc" target="_blank" rel="noopener">[Codex] sandbox実行の仕組みと設定方法を完全に理解する</a>
</p>
<p>Codex はデフォルトだとネットワークも制限されているようで、そういえば以前 <code>~/.codex/config.toml</code> に以下を設定したことを思い出しました。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#a6e22e">sandbox_workspace_write</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">network_access</span> = <span style="color:#66d9ef">true</span>
</span></span></code></pre></div><h2 id="対策方法への道のり">対策方法への道のり</h2>
<p>当初は <code>~/.codex/config.toml</code> へのこんな設定で解決しようとしましたが、うまくいきませんでした。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#a6e22e">shell_environment_policy</span>.<span style="color:#a6e22e">set</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">PATH</span> = <span style="color:#e6db74">&#34;/Users/masutaka/.local/share/mise/shims/ruby:(以下既存の PATH 設定をベタ書き)&#34;</span>
</span></span></code></pre></div><p>調べていく中で「サンドボックス内でも毎回 <code>~/.zshenv</code> はロードされるのでは？ Codex 関係の環境変数が定義されているなら、<code>~/.zshenv</code> で対策できそう」と閃いて、解決に至りました。</p>
<p><code>~/.zshrc</code> の <code>eval &quot;$(mise activate zsh)&quot;</code> が効かないのは、<code>~/.zshrc</code> がインタラクティブシェルでしか読み込まれないためです。Codex はコマンドを非インタラクティブシェルで実行するようで、全ての zsh 起動時に読み込まれる <code>~/.zshenv</code> 側の設定が効く、というわけです。</p>
<p>なお <code>eval &quot;$(mise activate zsh)&quot;</code> 自体を <code>~/.zshenv</code> に移す方法も思いつき、実際に動きはしました。ただ、これはあまり良くない方法だと思います。<a href="https://mise.jdx.dev/dev-tools/shims.html" target="_blank" rel="noopener">activate の PATH 方式</a>
はプロンプト表示のたびに環境変数を更新する仕組みで、プロンプトの出ない非インタラクティブシェルで使うのは本来の想定から外れるためです。</p>
<p>mise も非インタラクティブ環境（スクリプトや IDE、CI）では shims を推奨しており、今回はそれに従いました。<a href="/2026-03-29-1/">[2026-03-29-1]</a>
 で Emacs 向けに採用したのと同じ、shims を <code>PATH</code> に追加する方法です。</p>
<p><code>~/.codex/config.toml</code> への <code>PATH</code> のベタ書きは <code>~/.zshenv</code> との二重管理になるため避けたかったので、きれいな形に落ち着いてよかったです。</p>
<h2 id="まとめ">まとめ</h2>
<p>Codex CLI と Codex.app に mise 管理の Ruby や Node.js を使わせる方法をまとめました。</p>
<p>mise は普及しつつあると思いますが、ググっても分からず、みんなどうしているんだろうと思ったので、簡単な記事を書きました。どなたかの参考になれば幸いです。</p>
<h2 id="関連">関連</h2>
<ul>
<li><a href="https://github.com/masutaka/dotfiles-public/blob/f752b939d030779795b703001d3f65b45e7dd0d8/.zshenv" target="_blank" rel="noopener">現在の <code>~/.zshenv</code></a>
</li>
<li><a href="https://github.com/masutaka/dotfiles-public/blob/f752b939d030779795b703001d3f65b45e7dd0d8/.zshrc" target="_blank" rel="noopener">現在の <code>~/.zshrc</code></a>
</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>asdf と direnv を mise に移行した</title>
      <link>https://masutaka.net/2026-03-29-1/</link>
      <pubDate>Sun, 29 Mar 2026 17:52:27 +0900</pubDate>
      <guid>https://masutaka.net/2026-03-29-1/</guid>
      <description>&lt;p&gt;Ruby や Node.js などの開発ツールのバージョン管理は、&lt;a href=&#34;https://github.com/rbenv/rbenv&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;rbenv&lt;/a&gt;
 や &lt;a href=&#34;https://github.com/nodenv/nodenv&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;nodenv&lt;/a&gt;
 などの &lt;code&gt;*env&lt;/code&gt; 系ツールを経て、2019 年から &lt;a href=&#34;https://github.com/asdf-vm/asdf&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;asdf&lt;/a&gt;
 を使っていました。環境変数の管理は、さらに前の 2014 年から &lt;a href=&#34;https://github.com/direnv/direnv&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;direnv&lt;/a&gt;
 を使っていました。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ruby や Node.js などの開発ツールのバージョン管理は、<a href="https://github.com/rbenv/rbenv" target="_blank" rel="noopener">rbenv</a>
 や <a href="https://github.com/nodenv/nodenv" target="_blank" rel="noopener">nodenv</a>
 などの <code>*env</code> 系ツールを経て、2019 年から <a href="https://github.com/asdf-vm/asdf" target="_blank" rel="noopener">asdf</a>
 を使っていました。環境変数の管理は、さらに前の 2014 年から <a href="https://github.com/direnv/direnv" target="_blank" rel="noopener">direnv</a>
 を使っていました。</p>
<p>少し前から <a href="https://mise.jdx.dev/" target="_blank" rel="noopener">mise</a>
 というツールが話題です。特に困っていたわけではありませんが、なんとなくの好奇心と、mise には direnv のような機能もあると聞いたので、ツールの数を減らすモチベーションもあって移行してみました。環境は macOS です。</p>

<object type="image/svg+xml" data="https://gh-card.dev/repos/jdx/mise.svg?fullname=&link_target=_blank"></object>

<h2 id="mise-とは">mise とは</h2>
<p>mise（ミーズ）は、開発ツールのバージョン管理と環境変数の管理を 1 つで行えるツールです。asdf 互換のランタイム管理に加えて、direnv 相当の環境変数管理機能も備えています。</p>
<p>使って感じた特徴は以下のとおりです。</p>
<ul>
<li><code>.tool-versions</code> を参照できる（<code>.ruby-version</code> 等は設定が必要。後述）</li>
<li><code>mise.toml</code> で環境変数やタスクランナーも定義できる
<ul>
<li><a href="https://github.com/jdx/mise/blob/v2026.3.17/mise.toml" target="_blank" rel="noopener">公式の mise.toml</a>
 が参考になるかも</li>
</ul>
</li>
<li><code>mise.local.toml</code> で .gitignore 前提のローカル設定を持てる。チーム開発で mise 導入前でも個人で先行導入できる</li>
<li>ツール管理の体験がよく整理されている
<ul>
<li><code>mise install</code> 一発で <code>.tool-versions</code> のツールを全てインストールできる</li>
<li><code>mise list</code> で全ツールのバージョンと参照元ファイルを一覧確認できる</li>
</ul>
</li>
</ul>
<h2 id="移行で行ったこと">移行で行ったこと</h2>
<p>公式ドキュメントに <a href="https://mise.jdx.dev/faq.html#how-do-i-migrate-from-asdf" target="_blank" rel="noopener">asdf からの移行方法</a>
があるので、まずはこちらを参照してください。以下は私の環境での具体的な手順です。</p>
<h3 id="1-homebrew-パッケージの変更">1. Homebrew パッケージの変更</h3>
<p>asdf と direnv をアンインストールし、mise をインストールしました。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ brew uninstall --force asdf
</span></span><span style="display:flex;"><span>$ brew uninstall --force direnv
</span></span><span style="display:flex;"><span>$ brew install mise
</span></span></code></pre></div><h3 id="2-zsh-の設定変更">2. zsh の設定変更</h3>
<p><code>~/.zshenv</code> から asdf の設定を全て削除しました。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-diff" data-lang="diff"><span style="display:flex;"><span><span style="color:#f92672">-MY_ASDF_CONFIG_HOME=&#34;${XDG_CONFIG_HOME}/asdf&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#f92672">-export ASDF_CONFIG_FILE=&#34;${MY_ASDF_CONFIG_HOME}/asdfrc&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#f92672">-export ASDF_DATA_DIR=&#34;${XDG_DATA_HOME}/asdf&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#f92672">-export ASDF_GEM_DEFAULT_PACKAGES_FILE=&#34;${MY_ASDF_CONFIG_HOME}/default-gems&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#f92672">-export ASDF_NPM_DEFAULT_PACKAGES_FILE=&#34;${MY_ASDF_CONFIG_HOME}/default-npm-packages&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#f92672">-export ASDF_PERL_DEFAULT_PACKAGES_FILE=&#34;${MY_ASDF_CONFIG_HOME}/default-perl-modules&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#f92672">-export ASDF_PYTHON_DEFAULT_PACKAGES_FILE=&#34;${MY_ASDF_CONFIG_HOME}/default-python-packages&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#f92672">-export ASDF_RUBY_BUILD_VERSION=master
</span></span></span><span style="display:flex;"><span><span style="color:#f92672">-PATH=$ASDF_DATA_DIR/shims:$PATH
</span></span></span></code></pre></div><p><code>~/.zshrc</code> から direnv の設定も削除しました。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-diff" data-lang="diff"><span style="display:flex;"><span><span style="color:#f92672">-eval &#34;$(direnv hook zsh)&#34;
</span></span></span></code></pre></div><p>代わりに <code>~/.zshrc</code> に mise の設定を追加しました。この設定によって有効化される仕組みが PATH 管理を行うため、<code>~/.zshenv</code> への設定は不要です。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-zsh" data-lang="zsh"><span style="display:flex;"><span>eval <span style="color:#e6db74">&#34;</span><span style="color:#66d9ef">$(</span>mise activate zsh<span style="color:#66d9ef">)</span><span style="color:#e6db74">&#34;</span>
</span></span></code></pre></div><p>実際のファイルは以下になります。</p>
<ul>
<li><a href="https://github.com/masutaka/dotfiles-public/blob/df434ff7b79eb4f61817501a3ca21c6c3e37668d/.zshenv" target="_blank" rel="noopener"><code>~/.zshenv</code></a>
（mise の設定なし）</li>
<li><a href="https://github.com/masutaka/dotfiles-public/blob/df434ff7b79eb4f61817501a3ca21c6c3e37668d/.zshrc#L238-L252" target="_blank" rel="noopener"><code>~/.zshrc</code></a>
</li>
</ul>
<p>asdf 時代の環境変数がなくなり、zsh の設定がスッキリしました。</p>
<h3 id="3-ツールのインストール">3. ツールのインストール</h3>
<p><code>mise install</code> で asdf が管理していたツールをインストールし直しました。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ cat ~/.tool-versions
</span></span><span style="display:flex;"><span>nodejs 24.14.0
</span></span><span style="display:flex;"><span>ruby 4.0.2
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span>$ mise install
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span>$ mise list
</span></span><span style="display:flex;"><span>Tool       Version   Source            Requested
</span></span><span style="display:flex;"><span>node       24.14.0   ~/.tool-versions  24.14.0
</span></span><span style="display:flex;"><span>ruby       4.0.2     ~/.tool-versions  4.0.2
</span></span></code></pre></div><h3 id="4-default_packages_file-の移行">4. default_packages_file の移行</h3>
<p>asdf では <code>~/.zshenv</code> の環境変数で管理していた default_packages_file を、mise では <code>~/.config/mise/config.toml</code> に集約してみました。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#a6e22e">settings</span>.<span style="color:#a6e22e">node</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">default_packages_file</span> = <span style="color:#e6db74">&#34;~/.config/mise/default-npm-packages&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>[<span style="color:#a6e22e">settings</span>.<span style="color:#a6e22e">ruby</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">default_packages_file</span> = <span style="color:#e6db74">&#34;~/.config/mise/default-gems&#34;</span>
</span></span></code></pre></div><p>なお移行中に、Node.js の <code>default_packages_file</code> で <code>~</code> が展開されず default packages がインストールされないバグを見つけました。<a href="https://github.com/jdx/mise/discussions/8606" target="_blank" rel="noopener">Discussion#8606</a>
 に報告したところ、<a href="https://github.com/jdx/mise/pull/8709" target="_blank" rel="noopener">PR #8709</a>
 で修正されていました &#x1f64f; <a href="https://github.com/jdx/mise/releases/tag/v2026.3.11" target="_blank" rel="noopener">v2026.3.11</a>
 以降であれば問題ありません。</p>
<h3 id="5-ruby-version-や-node-version-の参照設定">5. .ruby-version や .node-version の参照設定</h3>
<p>asdf も mise も、デフォルトでは <code>.ruby-version</code> や <code>.node-version</code> を参照しません。asdf では <code>asdfrc</code> に <code>legacy_version_file = yes</code> を設定しますが、mise では以下の設定が必要です。リポジトリの <code>mise.toml</code> や <code>mise.local.toml</code> に設定しました。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#a6e22e">settings</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">idiomatic_version_file_enable_tools</span> = [<span style="color:#e6db74">&#34;node&#34;</span>, <span style="color:#e6db74">&#34;ruby&#34;</span>]
</span></span></code></pre></div><h2 id="移行しなかったもの">移行しなかったもの</h2>
<p>いくつかの設定は移行不要、または移行しない判断をしました。</p>
<ul>
<li>Ruby の pre-install hook
<ul>
<li>asdf では <a href="https://github.com/masutaka/dotfiles-public/blob/9aa6ff2e058dc2c87aae77bc8c640399cac34596/.config/asdf/asdfrc#L2" target="_blank" rel="noopener"><code>pre_asdf_install_ruby</code></a>
 で <code>RUBY_CONFIGURE_OPTS</code> を設定していたが、mise では設定しなくても大丈夫そうだった</li>
</ul>
</li>
<li><code>ASDF_RUBY_BUILD_VERSION=master</code>
<ul>
<li>mise は Ruby インストール時に <a href="https://github.com/jdx/mise/blob/v2026.3.17/src/plugins/core/ruby.rs#L87-L125" target="_blank" rel="noopener">ruby-build の最新バージョンを自動取得する</a>
ため設定不要だった</li>
</ul>
</li>
<li>perl の default-perl-modules
<ul>
<li>mise は perl の <code>default_packages_file</code> を未サポートだった（対処方法は後述の付録参照）</li>
</ul>
</li>
<li>direnvrc の PATH_add
<ul>
<li>
<p>Gemfile.lock がある Ruby プロジェクトで <code>./bin</code> を PATH に自動追加する設定をしていた</p>
</li>
<li>
<p>mise にグローバルな同等機能はないが、必要になったときに各プロジェクトの <code>mise.toml</code> で以下の設定をする方針とした</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#a6e22e">env</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">_</span>.<span style="color:#a6e22e">path</span> = <span style="color:#e6db74">&#34;./bin&#34;</span>
</span></span></code></pre></div></li>
</ul>
</li>
</ul>
<h2 id="まとめ">まとめ</h2>
<p>asdf + direnv の 2 ツールを mise 1 つに置き換えました。zsh の設定がスッキリしたのと、ツールバージョンと環境変数を <code>mise.toml</code> に集約できるのが良いところです。</p>
<p>後述の付録に書いた Emacs との相性問題などハマりどころはありましたが、総合的には移行してよかったと思います。</p>
<p>また、direnv が不要になったことで <code>.envrc</code> から <code>.env</code> に移行でき、後日 <code>.env</code> を <a href="https://developer.1password.com/docs/environments/" target="_blank" rel="noopener">1Password Environments</a>
 でマウントする構成にもつなげられました。</p>
<h2 id="参考情報">参考情報</h2>
<ul>
<li><a href="https://mise.jdx.dev/getting-started.html" target="_blank" rel="noopener">mise Getting Started</a>
</li>
<li><a href="https://techracho.bpsinc.jp/hachi8833/2025_09_29/153488" target="_blank" rel="noopener">miseは便利: タスクランナー兼ツールバージョン管理&amp;環境変数管理ツール - TechRacho</a>
</li>
<li><a href="https://developer.1password.com/docs/environments/" target="_blank" rel="noopener">1Password Environments</a>
</li>
<li><a href="https://dev.classmethod.jp/articles/1password-environments-env-management/" target="_blank" rel="noopener">1Password Environmentsで.envファイルを管理できるようになったので試してみた - DevelopersIO</a>
</li>
</ul>
<h2 id="付録">付録</h2>
<h3 id="emacs-で-ruby-lsp-が動作しない問題への対応">Emacs で ruby-lsp が動作しない問題への対応</h3>
<p>グローバルと異なる Ruby バージョンのリポジトリで、<a href="https://github.com/Shopify/ruby-lsp" target="_blank" rel="noopener">ruby-lsp</a>
 が Emacs 上で動作しない問題に遭遇しました。</p>
<p><code>mise activate zsh</code> はフックベースのアプローチで、ディレクトリ移動時に zsh の <code>chpwd</code> フックが発火してツールのバージョンを切り替えます。しかし Emacs はこのフックを実行しないため、mise のバージョン切り替えが機能しません。</p>
<p>mise にはフックベースの activate とは別に、shims という方式があります。</p>
<table>
  <thead>
      <tr>
          <th></th>
          <th>activate</th>
          <th>shims</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>向いている環境</td>
          <td>インタラクティブシェル</td>
          <td>非インタラクティブ（IDE、Emacs、スクリプト）</td>
      </tr>
      <tr>
          <td><code>cd</code> などのフック</td>
          <td>発火する</td>
          <td>発火しない</td>
      </tr>
      <tr>
          <td><code>which</code> の結果</td>
          <td>実際のツールのパスを返す</td>
          <td>shim のパスを返す</td>
      </tr>
  </tbody>
</table>
<p>最初は <code>~/.zshrc</code> に <code>eval &quot;$(mise activate zsh --shims)&quot;</code> を追加して両方を有効にしましたが、<a href="https://mise.jdx.dev/dev-tools/shims.html" target="_blank" rel="noopener">mise のドキュメント</a>
では activate と shims は排他的な使用を想定しています。</p>
<p>最終的には、以下の構成に落ち着きました。</p>
<ul>
<li><code>eval &quot;$(mise activate zsh)&quot;</code> は <code>~/.zshrc</code> に配置（インタラクティブシェル用）</li>
<li>Emacs 起動時のみ shims ディレクトリを PATH に追加</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-zsh" data-lang="zsh"><span style="display:flex;"><span>alias emacs<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;LC_COLLATE=C PATH=&#39;</span><span style="color:#e6db74">${</span>XDG_DATA_HOME<span style="color:#e6db74">}</span><span style="color:#e6db74">/mise/shims:</span>$PATH<span style="color:#e6db74">&#39; emacs&#34;</span>
</span></span></code></pre></div><p>通常の zsh セッションはフックベースのみ、Emacs 起動時だけ shims を使うという役割分担です。</p>
<p>asdf は shims のみのシンプルな設計だったので、一見すると複雑になったように見えます。しかしこれは mise が asdf の代替だけでなく、direnv の代替でもあることに起因するトレードオフだと理解しました。<code>mise activate</code> により環境変数の変更がリアルタイムでインタラクティブシェルに反映されるのは、shims では実現できない機能です。</p>
<h3 id="perl-の-default-packages-への対処方法">perl の default-packages への対処方法</h3>
<p>mise の default-packages の仕組みはコアプラグイン（Go, Node.js, Python, Ruby）にハードコードされた言語固有の機能です。Perl はコアプラグインではなく、Aqua バックエンド経由でインストールされるため対象外です。</p>
<p>回避策として <code>mise.toml</code> の <code>[hooks]</code> postinstall で <code>cpanm</code> を実行する方法があります<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。これにより <code>mise install</code> だけで Perl と CPAN モジュールの両方をセットアップできます。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#a6e22e">settings</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">experimental</span> = <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>[<span style="color:#a6e22e">hooks</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">postinstall</span> = <span style="color:#e6db74">&#34;cpanm CGI HTML::Template&#34;</span>
</span></span></code></pre></div><p>注意点として、hooks は experimental 機能のため <code>experimental = true</code> が必要です。また postinstall は perl 以外のツールインストール時にも実行されるため、mise install のたびにこの hooks がトリガーされます。</p>
<h3 id="mise-と-aqua-との関係">mise と aqua との関係</h3>
<p><a href="https://github.com/aquaproj/aqua" target="_blank" rel="noopener">aqua</a>
 は CLI ツール（terraform、gh 等）のバージョン管理に特化したツールで、checksum 検証によるセキュリティが充実しています。mise とはカバー範囲が異なりますが、mise は aqua-registry をバックエンドとして利用できる（<code>aqua:</code> プレフィックス）ため、aqua が管理するツール群も mise からインストールできます。</p>
<p>イコールではないものの、個人の dotfiles 管理では mise だけで aqua 的な用途も十分カバーできると感じました。チームで aqua を採用していたり、CI/CD でサプライチェーン対策として checksum 検証が必要な場合は、aqua を別途使う価値があると思います。</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://mise.jdx.dev/hooks.html" target="_blank" rel="noopener">Hooks | mise-en-place</a>
&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
  </channel>
</rss>
