Node.jsをfnmで管理(Windows)

2022/03/31

gulpを使っているプロジェクトで、CSS書き出しをするために npm install をしたらエラーが出まくって、試行錯誤したところ Node.js のバージョンが新しすぎたことが原因だった。

Node.js を直接インストールしていたが、バージョンをプロジェクトによって変更したい。ということで、Node.js を複数バージョン管理できる fnm を導入した。

fnm 導入

📗 Node.jsバージョン管理ツール「fnm」のインストール方法と使い方 – Qiita

fnm/README.md at master · Schniz/fnm

上記ページを参考にしつつ、Windows なので Chocolatey をインストール。新しい PC に変わってからいれていなかった。

Chocolatey Software | Installing Chocolatey

そして fnm を入れる。

choco install fnm -y

fnm を PowerShell で使うための設定

PowerShell を利用しようと思い、fnm/README.md に従って PowerShell のプロファイル(~\Documents\PowerShell\Microsoft.PowerShell_profile.ps1 or $PROFILE)に以下のように書いて保存。Microsoft.PowerShell_profile.ps1 ファイルがなかったので作成して書いた。

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

これでいけたかな、と PowerShell を再起動すると、次のようなエラーが。

. : このシステムではスクリプトの実行が無効になっているため、ファイル D:\◯◯◯\Windo
wsPowerShell\Microsoft.PowerShell_profile.ps1 を読み込むことができません。詳細については、「about_Ex
ecution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:3

調べたところ、実行ポリシーが初期状態だとファイルの実行ができないらしい。

参考:PowerShellでこのシステムではスクリプトの実行が無効になっているため、ファイル hoge.ps1 を読み込むことができません。となったときの対応方法 – Qiita

Set-ExecutionPolicyコマンドで実行ポリシーを変更すれば良い、けれども毎回変更して戻して~をするのは面倒なので、PowerShell のショートカットを作って以下のようにした。

リンク先の設定で、PowerShellのパスの後ろに -ExecutionPolicy Unrestricted とつけている。これでこのショートカットから起動すれば実行ポリシーが Unrestricted になる。このショートカットを使わず PowerShell を起動すれば実行ポリシーはデフォルトの Restricted のままになる。

これでショートカットから起動した PowerShell はエラーが出なくなった。

実行ポリシーについては@ITさんの記事から以下引用。

実行ポリシー署名付き署名なし/ローカル署名なし/ローカル概要
Restricted×××全てのスクリプトが実行禁止。PowerShellまたはWindows OSインストール直後のデフォルト設定(Windows Server 2012 R2を除く)
AllSigned××署名されているスクリプトのみが実行可能。署名されていないスクリプトは実行禁止
RemoteSigned×ローカルに保存されているスクリプトは実行可能。インターネットからダウンロードしたスクリプト(非ローカルのスクリプト)は、署名されているもののみが実行可能。Windows Server 2012 R2では、この設定がデフォルト
Unrestricted全てのスクリプトが実行可能。ただしインターネットからダウンロードしたスクリプトは、実行するかどうかが確認されるので、ユーザーが明示的に許可した場合のみ実行される
Bypass警告やユーザーへの確認なしに、全てのスクリプトが実行可能
PowerShellスクリプト実行ポリシー
WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する:Tech TIPS – @IT https://atmarkit.itmedia.co.jp/ait/articles/0805/16/news139.html

fnm コマンド

fnm を使う時は先程作成したショートカットから PowerShell を起動。以下、よく使うであろう fnm コマンドをメモ。

Node.js をインストール

# v16.x の最新をインストール
fnm install 16

# v14.0.9 をインストール
fnm install 14.0.9

使うバージョンの切り替え(インストール後にやる)

# v16.x の最新に切り替え
fnm use 16

# バージョンを確認、use で設定したバージョンになっていれば OK
node -v
# ついでに npm のバージョンも確認
npm -v

インストールしてあるバージョンを確認する

fnm list

プロジェクトごとにバージョンを切り替える

.node-version や .nvmrc ファイルがあるディレクトリでは自動で Node.js のバージョンが切り替わる。インストールされていないバージョンが指定されていた場合は、fnm がインストールしていいかと聞いてくれる様子。

自分で .node-version を指定する時は、fnm use で使うバージョンに切り替えて、次のようにして .node-version を生成すれば OK。

node -v > .node-version

おわり

PowerShell から fnm が快適に使え、gulp も動かすことができた!

やったーと思ったのだが、利用している Intellij IDEA からの gulp のタスク実行がうまくいかず。Intellij IDEA のターミナル画面にもエラーが。これについてはまた次の記事で。

追記:次の記事書きました→fnmを使っている場合IntelliJ IDEAで起こる問題を解決した