🚰

miseとaquaで同じパッケージをインストールして困ったこと

2024/09/12に公開

miseというツールで入れたdenoと、aquaというツールで入れたdenoの参照がうまく切り替わってくれなくて困ったお話です。
環境はmacOS、shellはzshを使っています。

TL;DR

  • eval "$(mise hook-env)"を設定したら意図した動きになったよ!
  • miseもaquaも便利!

ここからは起こった状況を含め説明していきます。

ある日のこと

私は書き捨てのスクリプトなどでよくdenoを利用するので、PCにはmiseを使ってdenoをインストールしています。
参考までに以下のようにインストールしました。

$ mise use -g deno@latest
mise deno@1.46.3 ✓ installed
mise ~/.config/mise/config.toml tools: deno@1.46.3

globalにはdeno@1.46.3が入った状態ですね。

後日、とあるプロジェクトでaquaを利用することになりました。
aquaの良さはこちらの参考書で説明されているので割愛しますが、興味のある方はご参照ください。
https://zenn.dev/shunsuke_suzuki/books/aqua-handbook

そのプロジェクトでは以下のような aqua.yaml によってパッケージが管理されています。

/private/project/aqua.yaml
---
# aqua - Declarative CLI Version Manager
# https://aquaproj.github.io/
# checksum:
#   enabled: true
#   require_checksum: true
#   supported_envs:
#   - all
registries:
  - type: standard
    ref: v4.220.1 # renovate: depName=aquaproj/aqua-registry
packages:
  - name: denoland/deno@v1.44.0
    tags: [ci, local]

このプロジェクトのディレクトリ下ではaquaによってインストールした deno@1.44.0 が利用されることを期待しています。
denoのコマンドパスを確認してみましょう。

/private/project:$ which deno
/Users/example/.local/share/mise/installs/deno/1.46.3/bin/deno

/private/project:$ deno -v
deno 1.46.3

はい、miseで入れた方が参照されていますね。違うんだ...aquaの方を見てくれ...!

続いてPATHの状況を見てみましょう。

/private/project:$ echo $PATH
/Users/example/.local/share/mise/installs/deno/1.46.3/bin:/Users/example/.local/share/mise/installs/deno/1.46.3/.deno/bin:/Users/example/.local/share/aquaproj-aqua/bin:/Users/example/.local/share/mise/shims

miseのbinディレクトリの参照が前に来ているので、それはそう、という感じですね。
ただ、.zshrcでのPATHの設定は以下のようになっています。

.zshrc
export PATH="$HOME/.local/share/mise/shims:$PATH"
export PATH="${AQUA_ROOT_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/aquaproj-aqua}/bin:$PATH"

/Users/example/.local/share/mise/installs/deno/1.46.3/bin

身に覚えのないPATHが設定されてるな... 🤔

原因と解決

原因

miseのセットアップの過程で、利用しているシェルの設定ファイルに以下のような記述が必要になります。

eval "$(mise activate zsh)"

これによってどうやらmiseによってインストールされたパッケージへのパスが$PATHへ追加されるようです。

そしてこれはシェルの設定ファイル内のexport PATHの順序に左右されず、遅延してセットされます。
(すみません、処理は追いきれなかった...!)

解決

解決策ではないですが、miseのFAQにヒントが記載されていました。
https://mise.jdx.dev/faq.html#what-does-mise-activate-do

以下を .zshrc へ追記することで、ディレクトリ移動時にPATHが書き換えられ、期待した通りの結果になりました。

eval "$(mise hook-env)"

再度、denoのパスとバージョンを確認してみましょう。

/private/project:$ which deno
/Users/example/.local/share/aquaproj-aqua/bin/deno

/private/project:$ deno -v
deno 1.44.0

ついでにPATHも見てみます。

/private/project:$ echo $PATH
/Users/example/.local/share/aquaproj-aqua/bin:/Users/example/.local/share/mise/shims:/Users/example/.local/share/mise/installs/deno/1.46.3/bin:/Users/example/.local/share/mise/installs/deno/1.46.3/.deno/bin:/Users/example/.local/share/aquaproj-aqua/bin:/Users/example/.local/share/mise/shims

aquaのPATHが2重で追加になっているものの、ひとまず意図した通りの順序になったので良しとしましょう!

最後に

aquaは自身の開発環境とほかメンバーの環境、またはCI上でのパッケージのバージョンを同一にできるし、miseも同様に容易にパッケージが入れられる便利なツールです。
本記事ではaquaとmiseで同じパッケージを入れている場合に起こった困りごとの紹介を行いました。
両方のツールとも用途が被っている部分もあるので、あまり同様の状況に遭遇することはないかもしれませんが、もし遭遇した際に参考になれば幸いです。

asdfの場合はこちらをご参照ください。(大変参考になりました、ありがとうございます!!)
https://zenn.dev/shunsuke_suzuki/books/aqua-handbook/viewer/tips#asdf-などと併用する場合の注意点

株式会社モニクル

Discussion