asdf でグローバルランタイムを利用する (macOS)
asdf を利用している環境下で、個々のプロジェクトでは特定のバージョンのランタイムを使用しつつ、プロジェクトの外ではグローバルにインストールされたランタイムを使用するための設定について記す。特に、 Homebrew で Python をインストールした際、 asdf の設定のみではグローバルのランタイムにパスが通らないので、その対処法について記す。
背景
突然だが、自分はエディタとして Neovim を利用している。 Neovim 上で LSP による自動補完を実現する際、 npm や pip などのパッケージ管理ツールを通して、関連するライブラリをインストールしなければならない場合がある。例えば、 Neovim プラグインの mason.nvim では、 Python の language server である Pyright をインストールする際に npm install を実行する。
:checkhealth を実行すると、 Mason が npm に依存していることが分かる
asdf を利用してプロジェクトごとにランタイムを管理している場合、 JS と無関係なプロジェクトでは npm のパスが通っておらず、関連ライブラリのインストールに失敗する、といった問題に遭遇することがある。これを避けるため、特定のプロジェクトコンテキストにないディレクトリでは、システム組み込みや Homebrew でインストールしたランタイムをデフォルトで使用できるようにしたい。
環境
- macOS: Sonoma 14.4.1
- Homebrew: 4.2.21
- python@3.12
- Zsh: 5.9
asdf の設定
次のように global
コマンドのバージョン名の部分に system
を設定すれば良い。
$ asdf global nodejs system
この設定は ~/.tool-versions
に書き込まれる。
$ cat ~/.tool-versions
nodejs system
もちろん、各プロジェクトではプロジェクトルートに配置された .tool-versions
で指定されたバージョンのランタイムが使用され、グローバルランタイムが使用されることはない。
Homebrew で Python をインストールした場合の設定
Homebrew で Python をインストールした場合、 asdf global python system
を設定するだけでは、 python
コマンドの実行は失敗する。
$ python
No python executable found for python system
これは、インストール時に python3
へのパスは通るが、 python
へのパスは通らず、 asdf が Python ランタイムを見つけられないためだ。
Python インストール時の Caveats
に、この件について出力されている。
==> Caveats
Python has been installed as
/usr/local/bin/python3
Unversioned symlinks `python`, `python-config`, `pip` etc. pointing to
`python3`, `python3-config`, `pip3` etc., respectively, have been installed into
/usr/local/opt/python@3.12/libexec/bin
See: https://docs.brew.sh/Homebrew-and-Python
要するに、 /usr/local/opt/python@3.12/libexec/bin
(2024年5月時点) にパスを通す必要がある。 Zsh の場合は ~/.zshrc
に次のような設定を追加すれば良い。
path=($(brew --prefix python)/libexec/bin ${path})
Discussion