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 | ○ | ○ | ○ | 警告やユーザーへの確認なしに、全てのスクリプトが実行可能 |
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で起こる問題を解決した