miseとaquaで同じパッケージをインストールして困ったこと
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の良さはこちらの参考書で説明されているので割愛しますが、興味のある方はご参照ください。
そのプロジェクトでは以下のような 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の設定は以下のようになっています。
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にヒントが記載されていました。
以下を .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の場合はこちらをご参照ください。(大変参考になりました、ありがとうございます!!)
Discussion