npm の dotenv と cargo-make の --env-file オプションで、パースのされ方が異なったので調査

npm の dotenv パッケージと cargo-make の --env-file オプションで、パース方法に違いがあったので調べた結果をまとめました。

調査に利用したソースは https://gitlab.com/nogiro/dotenv-inspection に配置しています。

違いがあったのは ' (シングルクォート) と # (シャープ) まわりです。

この記事で比較するのは以下の 2 個です。


上記リポジトリーを clone すると、以下の .env ファイルを用意してあります。

DOTENV_INSPECTION_NOT_QUOTED=foo#bar
DOTENV_INSPECTION_SINGLE_QUOTED='foo#bar'
DOTENV_INSPECTION_DOUBLE_QUOTED="foo#bar"

npm installcargo install cargo-make の後で、npm run envcargo make --env-file .env env を実行するとそれぞれの違いが確認できます。

npm run --silent dev

DOTENV_INSPECTION_NOT_QUOTED=foo
DOTENV_INSPECTION_SINGLE_QUOTED=foo#bar
DOTENV_INSPECTION_DOUBLE_QUOTED=foo#bar

クォートされていない場合は、# 以降がコメントとして削除されていることが確認できます。

cargo make --quiet --env-file .env env

DOTENV_INSPECTION_SINGLE_QUOTED='foo#bar'
DOTENV_INSPECTION_NOT_QUOTED=foo#bar
DOTENV_INSPECTION_DOUBLE_QUOTED=foo#bar

シングルクォートでクォーテーションした場合に、シングルクォートが残っていることが確認できます。(また、逆順にソートされるようです。)

まとめ

npm の dotenv と cargo-make を同時に利用するプロジェクトでは、# を含む値はダブルクォートで囲むと良いようです。

(リポジトリーでは envmnt (cargo-make が利用してる crate) と Rust の dotenv crate、python-dotenv も比較しています。)