お手伝いしているプログラミングスクールで Firebase を使う講義の際に Proxy 設定がされている社用 PC の方の環境で盛大にハマりどころがあったのでメモ。
Windows 環境は扱った経験がないので適当な記述になっているかと思います。ご了承ください。
1. npm install firebase-tools
ができない
$ npm i -g firebase-tools npm ERR! code ENOTFOUND npm ERR! syscall getaddrinfo npm ERR! errno ENOTFOUND npm ERR! network request to https://registry.xxxxxx.com/firebase-tools failed, reason: getaddrinfo ENOTFOUND registry.xxxxxx.com npm ERR! network This is a problem related to network connectivity. npm ERR! network In most cases you are behind a proxy or have bad network settings. npm ERR! network npm ERR! network If you are behind a proxy, please make sure that the npm ERR! network 'proxy' config is set properly. See: 'npm help config'
エラーが長いですが注目すべきポイントは下記です
npm ERR! network request to https://registry.xxxxxx.com/firebase-tools failed, reason: getaddrinfo ENOTFOUND registry.xxxxxx.com
npm でアクセスするレシストリが独自のものに変更されているのが原因
社用 PC だからかレジストリが独自のものが設定されていました…
# npm の設定確認 $ npm config list -g # 略 registry = "https://registry.xxxxxx.com/" # 略
registry が https://registry.npmjs.org/
以外になっていると別の所にアクセスしてしまいます。
1-1. config の registry 設定を修正する
global インストールが必要な場合は global の設定を修正せざるを得ないかなと思います。
# registry を変更する $ npm config set registry https://registry.npmjs.org/
1-2. 現在のプロジェクトで registry 設定を変更する
.npmrc
があるとそちらの設定が使われるので、プロジェクトに .npmrc
を作成してそこに registry の設定を作成する
.npmrc
registry=https://registry.npmjs.org/
現在のプロジェクトのレジストリの確認
$ npm config ls -l # 略… ; registry = "https://registry.xxxxxx.com/" ; overridden by project ; "project" config from /Users/kikiki/my-project/.npmrc registry = "https://registry.npmjs.org/"
registry が https://registry.npmjs.org/
になっていれば OK
2. firebase コマンドが実行できない
社用 PC PowerShell の方の環境で発生しました
> firebase login
firebase : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Users\...\npm\firebase.ps1 を読み込むことができません。
PowerShell の実行権限の問題
PowerShell にはプログラムの実行権限 (ポリシー)があるらしく、プログラムを自由に実行できない権限になっていると このシステムではスクリプトの実行が無効になっているため
というエラーが出るようです。
権限を確認して Restricted
なら RemoteSigned
に変更する
## 現在のポリシーを確認 > Get-ExecutionPolicy Restricted ## Restricted になっているとインストールしたコマンドを実行できないので変更する ## 現在のプロセスを RemoteSigned ポリシーに変更 > Set-ExecutionPolicy RemoteSigned -Scope Process ## ポリシーの確認 > Get-ExecutionPolicy RemoteSigned
ポリシー | 内容 |
---|---|
Restricted |
構成ファイルの読み込みやスクリプトの実行を行いません。既定値は "Restricted" です。 |
AllSigned |
すべてのスクリプトと構成ファイルが信頼された発行元によって署名されていることを要求します (ユーザーがローカル コンピューターに書き込むスクリプトを含む)。 |
RemoteSigned |
インターネットからダウンロードされたすべてのスクリプトおよび構成ファイルが、信頼された発行元によって署名されていることを要求します。 |
Unrestricted |
すべての構成ファイルを読み込み、すべてのスクリプトを実行します。インターネットからダウンロードされた署名されていないスクリプトを実行する場合、スクリプトを実行する前に確認を求められます。 |
Bypass |
何もブロックされず、警告もメッセージも表示されません。 |
Undefined |
現在のスコープから現在割り当てられている実行ポリシーを削除します。このパラメーターは、グループ ポリシー スコープ内で設定された実行ポリシーは削除しません。 |
cf. 実行ポリシーの設定値について
3. firebase login で Failed to make request to のエラーが発生する
$ firebase login i Firebase optionally collects CLI usage and error reporting information to help improve our products. Data is collected in accordance with Google's privacy policy (https://policies.google.com/privacy) and is not used to identify you. ? Allow Firebase to collect CLI usage and error reporting information? (Y/n) Error: Failed to make request to https://firebase-public.firebaseio.com/cli.json
👉 エラーが発生して落ちる。Error: Failed to make request to https://firebase-public.firebaseio.com/cli.json
firebase からのアクセスが遮断されているっぽい。今回のケースでは社用 PC に設定された Proxy が弾いていたっぽい
Proxy の設定を行い TLS接続の証明書検証を無効化する
生徒さんのターミナルの環境が異なっていてコマンドが異なるから大変だった…
3-1. Proxy の設定
$ export HTTP_PROXY=http://${username}:${password}@${proxyhost}:${port} $ export HTTPS_PROXY=http://${username}:${password}@${proxyhost}:${port}
Windows ターミナル
$ set HTTP_PROXY=http://${username}:${password}@${proxyhost}:${port} $ set HTTPS_PROXY=http://${username}:${password}@${proxyhost}:${port}
> $env:http_proxy="http://${username}:${password}@${proxyhost}:${port}" > $env:https_proxy="http://${username}:${password}@${proxyhost}:${port}"
3-2. TLS接続の証明書検証の無効化
⚠ 自分の環境ではなかったので、この設定も確実に必要なのかは検証できていません
NODE_TLS_REJECT_UNAUTHORIZED=value
Ifvalue
equals'0'
, certificate validation is disabled for TLS connections. This makes TLS, and HTTPS by extension, insecure. The use of this environment variable is strongly discouraged.
cf. Command-line API | Node.js v18.7.0 Documentation
あまり推奨されるものではないので環境変数を設定して一時的に無効化する
$ export NODE_TLS_REJECT_UNAUTHORIZED=0
Windows ターミナル
$ set "NODE_TLS_REJECT_UNAUTHORIZED=0"
> $env:NODE_TLS_REJECT_UNAUTHORIZED=0
毎回この設定を使ってるターミナルでやっておいてね。とするのは大変なので設定ファイルとかで自動的に設定を読み込ませるようにできるのが良さそうです。
所管
今回は生徒さんが所謂プログラム未経験で、それぞれが持ってきたマシンで環境が Mac / Windows の両方があり、その上それぞれのターミナルが bash だったり zsh だったり コマンドプロンプト だったり PowerShell だったりと分かれていて生徒さん自身がそれらの違いを認識していない / 違いを知らないという状況だったので、人によってはできるのにこちらの人ではできないという地獄絵図が発生してしまいました。
さくっとできるを体験するには Firebase はとても良いのですが、授業のような場で使うには最低限の基礎知識がある又は環境を揃えておくのが良さそうに思いました。
ぼくもよくハマるのですが、調べまくって何とかする習慣がいつの間にか身についているのですが自分の知識が浅い環境周りでハマるとホント辛い思いをするし未経験でスクールに来た人は心折れちゃいそう〜って感じました。 環境が揃ってないスクールそれはそれで大変ですね…
おわり
[参考]
- npm でプロキシを設定/解除する - Qiita
- CLI環境でFirebaseへログインする方法 - Qiita
- PowerShellのExecutionPolicyのスコープとかについて詳しく - Qiita
- Proxy環境下でFirebaseのログインにハマった - Qiita
- 独自の npm registry を使う - Qiita
- Node.js/npm/設定をグローバル、ユーザー、プロジェクトで使い分ける - yanor.net/wiki
- パッケージマネージャのProxyやSSL設定など - Qiita
- Command-line API | Node.js v18.7.0 Documentation