node v12+でgraceful-fsが動かない
今更ですが、node.js のバージョンを 10 系から 12 系にあげてみました。
すると自作ツールが動かなくてハマったのでメモ。。。
unzipを利用するツールがあったのですが、最終更新が 6 年前。
このライブラリが使っている graceful-fs
、さらにはその先の fstream
が v12 系に対応していないらしく、エラーがでます。
ReferenceError: primordials is not defined
いろいろ調べてみると gulp が古いとだめだよ、って書いてありましたがそもそも gulp 使ってないし。
直接 node.js で JavaScript 実行してるだけだし。
unzip のアップデートができない
開発が止まっているので、yarn
から入れ直しても解決しません。
unzip
に見切りをつけて、別のライブラリを利用することにしました。
unzipper ってのがある
よく調べずに、unzip 検索結果の次に来ていた unzipper
を採用。
使い方とかどうなんだろ。
unzip の削除と unzipper のインストール
単純に package.json の登録を入れ替えました。
yarn remove unzip
yarn add unzipper
なんと、そのまま利用できた!
ツールで利用しているのは pipe で unzip にストリーム渡しているだけです。
fs.createReadStream(f)
.pipe(unzip.Parse()) // ← ここ
.on('entry', function (entry) {
// do something...
}
unzipper にも同じ名前のparse
関数があったので、require
先のライブラリだけ変更して実行。
すると、何事もなかったかのように同じ出力結果が得られました! バンザイ!
ところが?
unzip
だと全解凍、内部ファイルの読み出しからクローズまで終わってからclose
イベントを発火していたのですが、unzipper
は内部ファイルを引き渡したらすぐにclose
してしまうみたいです。
スキャン完了してからクローズが走って後処理、という流れだったのに先にクローズが走ってからスキャン完了になるという。。。
まあ、Promise 一つかますだけですが。
ライブラリの end of life には気をつけましょう、というお話でした。