Nushell で fnm を用いて Node.js を利用する設定手順
Nushell 上で node コマンドを確実に解決させるためには、fnm env が出力する環境変数(特に FNM_MULTISHELL_PATH)を Nushell の PATH に適切に反映させる必要があります。本記事では、その最小設定と検証プロセスをまとめます。
バージョン
| 名称 | バージョン |
|---|---|
| Nushell | 0.98.0 |
| fnm | 1.37.1 |
結論($nu.env-path に記述する内容)
Nushell の環境初期化ファイル($nu.env-path)に、次の設定を追加します。
# 参考: PATH のエントリ追加の一般的パターン(Nushell Book より)
# $env.PATH = ($env.PATH | split row (char esep) | prepend '/some/path')
# あるいは stdlib の `path add` を使う方法もある:
# use std "path add"
# $env.PATH = ($env.PATH | split row (char esep))
# path add /some/path
# path add ($env.CARGO_HOME | path join "bin")
# path add ($env.HOME | path join ".local" "bin")
# $env.PATH = ($env.PATH | uniq)
# fnm が出力する環境変数を JSON として受け取り、まとめて取り込む
fnm env --json | from json | load-env
# Linux では node バイナリが `$env.FNM_MULTISHELL_PATH / "bin"` 配下になる点に注意
# ここではクロスプラットフォーム向けに multishell パス自体を PATH 先頭に加える
$env.PATH = (
$env.PATH
| split row (char esep)
| prepend $env.FNM_MULTISHELL_PATH
| uniq
)
補足:
- Linux のみ
($env.FNM_MULTISHELL_PATH | path join "bin")を使うアプローチも可能です。 - 既存 PATH と重複しないよう
uniqでユニーク化しています。
検証プロセス
1) fnm env の基本挙動(PowerShell の例から把握)
fnm の README では PowerShell 用に次の初期化が案内されています。
https://github.com/Schniz/fnm?tab=readme-ov-file#powershell
fnm env --use-on-cd --shell power-shell | Out-String | Invoke-Expression
この出力には、$env:FNM_LOGLEVEL = "info" のような環境変数設定が含まれます。
つまり fnm env は各シェル向けの「環境変数設定スクリプト」を生成するコマンドです。
2) fnm env の内部実装の要点
fnm の実装(Rust)を確認すると、env サブコマンドは FNM_MULTISHELL_PATH などを生成し、Windows では PATH の先頭に FNM_MULTISHELL_PATH を挿入する文字列を出力します。
src/commands/env.rs(抜粋の要旨)FNM_MULTISHELL_PATHを算出- シェル種別に応じて
PATHへ追加する文字列を生成 - Windows:
FNM_MULTISHELL_PATHをそのままPATHへ - Unix:
FNM_MULTISHELL_PATH/binをPATHへ
このため、Nushell でも同様に FNM_MULTISHELL_PATH を PATH に入れる必要があります。
3) Nushell での取り込み(load-env まで)
Nushell では fnm env --json を使うと JSON 形式で環境変数の集合を取得できます。from json で record に変換し、load-env で一括反映します。
# そのまま load-env すると型不一致になるため、まず JSON を record 化する
fnm env --json | from json | load-env
# 反映確認
$env.FNM_LOGLEVEL
# => info 等
4) PATH の調整と Node 実行確認
FNM_MULTISHELL_PATH を PATH に追加した後、node --version が解決できることを確認します。
$env.PATH = (
$env.PATH
| split row (char esep)
| prepend $env.FNM_MULTISHELL_PATH # Linux は join "bin" も検討
| uniq
)
node --version
# => vXX.YY.ZZ
参考リンク
- Nushell Book: Environment
- Nushell Book: Types of data / Records
- fnm README
- Invoke-Expression(PowerShell / Microsoft Docs)
- Out-String(PowerShell / Microsoft Docs)
まとめ
fnm env --json | from json | load-envで fnm の環境変数を Nushell に一括適用できる。- さらに
FNM_MULTISHELL_PATHをPATHに追加することで、nodeが解決される。 - 設定は
$nu.env-pathに記述しておくと、起動時に自動で反映される。