🌏

asdf でグローバルランタイムを利用する (macOS)

2024/05/10に公開

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