LoginSignup
0
0

cross-env + NODE_OPTIONSに複数オプションを格納する

Posted at

環境

  • 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は無視されます。

package.json
"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",
]

解決策

以下が成功パターンです。

ダブルクォーテーションで、一つの塊と認識させます。

package.json
"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に近くなってくると途端に知識不足に見舞われます。

残念ながら、発生ベースで勉強していくしかないですね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0