Skip to content

Windows環境でのFNMインストール時の「環境変数が見つからない」エラーの解決法

問題の概要

Windows 10/11環境でFast Node Manager(FNM)を用いてNode.jsを管理する際、以下のエラーが発生することがあります:

powershell
error: We can't find the necessary environment variables to replace the Node version.
You should setup your shell profile to evaluate `fnm env`,
see https://github.com/Schniz/fnm#shell-setup

このエラーは主に以下の操作後に発生します:

  1. FNMのインストール(winget install Schniz.fnm
  2. Node.jsのダウンロード(fnm install 16.2.0など)
  3. Nodeバージョンの切り替え試行(fnm use 16.2.0

根本原因: PowerShellがFNMの環境変数をロードしていないためです。初期セットアップ時にシェルプロファイル($profile)の設定が不足しているケースが大半です。


基本解決策:PowerShellプロファイルの設定

公式ドキュメント推奨の手順で解決する標準的な方法です。

手順

  1. PowerShellを管理者権限で起動
  2. プロファイルファイルが存在しない場合は作成:
    powershell
    if (-not (Test-Path $profile)) { New-Item $profile -Force }
  3. プロファイルを編集:
    powershell
    # 現在のプロファイルファイルを開く
    Invoke-Item $profile
  4. 開いたファイルの末尾に次を追加:
    powershell
    fnm env --use-on-cd --shell powershell | Out-String | Invoke-Expression
  5. ファイル保存後にPowerShellを再起動
  6. 動作確認:
    powershell
    node -v  # バージョンが表示されれば成功

重要ポイント

  • --use-on-cdオプション:ディレクトリ移動時に自動で.nvmrcを読み込み
  • --shell powershell:PowerShell用に最適化された出力を生成

応用解決策:ユーザー名に特殊文字がある場合

ユーザー名に非ASCII文字(例:João Lucas)が含まれる場合、文字化けにより基本手順が失敗することがあります。この場合の回避策:

修正版プロファイルスクリプト

  1. $profileファイルを開き、以下に置き換え:
    powershell
    if (Get-Command fnm -ErrorAction SilentlyContinue) {
        # テンポラリファイル経由でUTF8エンコーディングを強制
        $fnmOutputFile = "$env:TEMP\fnm_env.txt"
        
        # 外部プロセスで実行し出力をキャプチャ
        Start-Process -NoNewWindow -FilePath "fnm" `
                      -ArgumentList 'env --use-on-cd --shell powershell' `
                      -RedirectStandardOutput $fnmOutputFile `
                      -Wait
        
        $envScript = Get-Content -Path $fnmOutputFile -Encoding UTF8 -Raw
        Invoke-Expression $envScript
    }
  2. 変更保存後にPowerShell再起動

文字化けが起きる理由

PowerShellデフォルトのOut-Stringが特殊文字を誤変換します。テンポラリファイル経由でUTF8読み込みを明示することで回避可能です。


その他の注意点とトラブルシューティング

1. 管理者権限の不足

powershell
fnm env --use-on-cd | Out-String | Invoke-Expression

上記コマンド実行時にエラーが出る場合、PowerShellを管理者として実行していない可能性が高いです。

2. プロファイルスクリプトの実行ポリシー

スクリプト実行がブロックされる場合、一時的に制限を緩和:

powershell
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

3. マルチシェル環境での対応

Command Prompt(cmd.exe)を使用する場合は、別途設定が必要:

cmd
:: fnm_env.cmd
@echo off
if not defined FNM_AUTORUN_GUARD (
    set "FNM_AUTORUN_GUARD=AutorunGuard"
    FOR /f "tokens=*" %%z IN ('fnm env --use-on-cd') DO CALL %%z
)

根本原因の技術解説

FNMはNodeバージョン切り替え時にPATH環境変数を動的に変更します。しかし:

  • PowerShell起動時にfnm envの出力結果が評価されない
  • 環境変数がシェルセッションに注入されない
  • 結果としてnodeコマンドが認識されない

プロファイルスクリプトの追加により、シェル起動時とディレクトリ変更時の両方で自動的に環境変数を更新する仕組みを構築できます。


最終確認と代替案

正常動作の確認

powershell
# Nodeバージョン確認(インストール済みバージョンが表示されるか)
node -v

# 利用可能なNodeリスト表示
fnm list

FNMの代替管理ツール

問題が解決しない場合の選択肢:

  1. nvm-windows
    Windows専用の安定版バージョンマネージャー
  2. Volta
    クロスプラットフォーム対応の代替ツール

ℹ️ 本記事の解決策はFNM公式DOCS(Shell Setup)をベースに、実環境での障壁を補足したものです