環境
- Bash と CMD
- Nextjs(関係ないですが)
背景
Node V18への移行で、fetch failed
エラーが発生したため、NODE_OPTIONSにいくつかのオプションを格納しようとしたところ、Scriptsが異なる環境間で正常に動作しませんでした。
簡単に対応メモを残します。
※ちなみにfetch failed
の発生は、OSが取得するipvを優先するという仕様変更と、Fetch API(experimental feature)の導入によるものです。
原因
以下が失敗パターンです。
Bashでは動作しますが、CMDでは、NODE_OPTIONS=--no-experimantal-fetch
のみが考慮され、--dns-result-order=ipv4first
は無視されます。
"scripts" : {
"dev": "cross-env NODE_OPTIONS='--no-experimental-fetch --dns-result-order=ipv4first' next dev"
}
これは、CMDではスペースが引数の区切りと認識されてしまうためです。
※PowerShellでも同様の仕様でした。
node_modules/cross-env/src/index.js
に以下のようにログを仕込み、確認してみます。
function crossEnv(args, options = {}) {
console.log(args)
本来、NODE_OPTIONS
という環境変数に格納されるべき--no-experimantal-fetch
と--dns-result-order=ipv4first
が、別々のコマンドになっていることが分かります。
[
"NODE_OPTIONS='--no-experimental-fetch",
"--dns-result-order=ipv4first'", // コマンドで実行されても何も起きない。
"xxx",
"ooo",
]
解決策
以下が成功パターンです。
ダブルクォーテーションで、一つの塊と認識させます。
"scripts":{
"dev": "cross-env NODE_OPTIONS=\"--no-experimental-fetch --dns-result-order=ipv4first\" next dev"
},
ログも以下のようになりました。
[ 'NODE_OPTIONS=--no-experimental-fetch --dns-result-order=ipv4first',
"xxx",
"ooo",
]
最後に
体系的に情報工学を学んだことがないので、コマンド系の差異など、OSに近くなってくると途端に知識不足に見舞われます。
残念ながら、発生ベースで勉強していくしかないですね。