現象
WindowsにLTS版のNode.jsを入れて作業しているとき、
バージョン管理ツールなどを特に用いてないため、今どんなバージョンなのか
知ろうとして、npm -v
で確認しようとしました。
すると、なぜかバージョンを確認できない状態に...。
npm : ファイル C:\Program Files\nodejs\npm.ps1 を読み込めません。ファイル C:\Program Files\nodejs\npm.ps1 はデジタル署名されていませ
ん。このスクリプトは現在のシステムでは実行できません。スクリプトの実行および実行ポリシーの設定の詳細については、「about_Execution_Po
licies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
Node.jsが入っていてnpmがないことはありえないので、なんだろう~と思っていたところ、Powershellで開いていたこと、かつ、参照する権限がないことが原因だったようです。
スタートボタンからcmdを検索してそこからnpm -v
を試すと、すぐに見つけてくれました。
しかし、折角なのでPowershellでもnpm.ps1を確認する方法をまとめておきます。
実行ポリシーについて
上記のエラーにもある通り、npmを参照することはセキュリティ的に制限されているようです。そもそも、実行ポリシー(ここではExecutionPolicy
と呼称します)は主に6つの種類によって分けられています。
ExecutionPolicyの種類
Restricted(制限付き) | AllSigned(すべて署名済み) | RemoteSigned(リモート署名済み) | Unrestricted(無制限) | Bypass(バイパス) | Undefined(未定義) |
---|---|---|---|---|---|
デフォルト設定 | 信頼できる発行元に署名されたスクリプトのみ実行可能 | ローカルで作成したスクリプトは署名なしで実行可能 | すべてのスクリプトを実行可能 | すべてのスクリプトを警告なしで実行 | 現在のスコープに設定がない |
対話モードのみ使用可能 PowerShellスクリプトの実行を完全に禁止 | スクリプトにデジタル署名が必要 | ローカルで作成したスクリプトは署名なしで実行可能 | 危険なスクリプトを実行する前に警告が表示される | セキュリティ上のリスクが高い | 親スコープからポリシーを継承 |
ExecutionPolicyはそれぞれ異なるスコープ別に設定することが可能です。
ExecutionPolicyのレベル別設定
Process | CurrentUser | LocalMachine | UserPolicy | MachinePolicy |
---|---|---|---|---|
現在のPowerShellセッションのみ(終了すると失効) | 現在のユーザーのみ | コンピュータ上のすべてのユーザー | Group Policyで設定されたユーザーポリシー | Group Policyで設定されたコンピュータポリシー |
設定内のGroup Policyとは、Windows環境内でのユーザーとコンピューターの設定を一元管理するためのシステム
です。IT管理者が、組織全体のスコープレベルを設定する際などに使われそうですね(興味ありますがここについては割愛)。
一時的に実行ポリシーを変更する
さて、npmをPowershellで参照するために一時的にExecutionPolicyを変更します。
以下のようなコマンドを打てば変更できます。
// 現在開いているshell内のみで警告なしにscriptを実行可能にする
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
永続的に権限を変更したい場合、管理者権限で開いて以下のコマンドを実行します。
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
CurrentUser
は個人利用の場合では基本的に1ユーザーのみですので、警告と署名もなしに実行できるということになりますね。
組織レベルになってくると、上記に記載したGroup Policy
の設定が関わってくるのですが、このレベルを知っていても社内では操作できない(してはいけない)と思うので、Powershellのデフォルトと設定可能な権限は上記を理解していれば十分な気がします。
さて、npmをPSで参照するという、大して意味をなさない、というか勘違いから生まれた調査ですが、windowsのコマンドについて少し理解ができました。
予期せぬ発見は、こういうところから生まれるかもしれませんね!