Node.js 12.10.0 で rimraf がビルトインに追加された
◆ rmdir で再帰的削除ができる
mkdir に続いて rmdir も recursive に対応しました
rimraf を入れたり OS コマンドを直接呼び出したりの手間が省けます
内部的には 1 から実装してるのかとおもいきや rimraf をそのまま取り込んだようです
https://github.com/nodejs/node/pull/29168
経緯はこっちの方が詳しいです
https://github.com/nodejs/node/pull/28208
ファイルシステムにふれる部分で OS 固有の問題もあったりして rimraf は昔から一番使われてるものでそういうところの対処もされているのでそのまま使うのが良いという判断のようです
並列処理的なところでも C++ でするより Node.js レベルでやったほうが libuv のイベントループでの非同期処理で並列実行できてパフォーマンスが良いみたいです
名前については fs.rmdir とは別に shutil を作ることが提案されてましたが すでに shutil って名前のはパッケージはあったり 新しいパッケージを作ることは反対の人が多いようです
個人的にも Python で shutil が分かれてるのは使いやすいと思ってないので fs にまとめてくれてよかたです
rmdir は OS コマンド的にはフォルダを消すものでファイルは削除しません
動作的には rm -rf です
なので混乱するから rmdir じゃないほうが良いという意見も出てますが Node.js だと通常のファイル削除が rm じゃなくて unlink ですでにコマンドと違います
なので rmtree という新しい関数名も出てますが 結局 rmdir に引数追加で決まったようです
rmdir の反対意見には その機能があることを検出できないというのもありました
mkdir のときに 今のバージョンが mkdir に recursive が有効なのかどうかを Node.js の内部で見分ける方法がなくてそれがほしいという意見もでていたそうです
たぶん polyfill 用だと思います
ただそれを理由で rmdir に入れるのをやめるほどじゃないみたいな意見もあって 入れるなら process.features とかに追加すれば良いと言う感じでした
process.features はドキュメントにもなってないようで そんなのあるなんて全然知らなかったです
ただ 見てみても余り情報はなかったです
12.10 での結果です
mkdir のときと違って rmdir の引数にオプションの数が増えたので検出自体は関数の length プロパティを見ることでできるようです
あとは rimraf 自体は glob パッケージに依存していて foo/* みたいなので削除できるようです
ただ glob は含めず rmdir に rimraf の機能だけを入れたいのでここをどうするかも問題となっていました
それも作者が glob は必須じゃないよう対応してくれて無事リリースされたようです
rimraf は 2.7.0 から glob はあるときだけ使うようにして ないのに使おうとしたらエラーがでるようになりました
https://github.com/isaacs/rimraf/commit/dc1682d546114fd042f90e57af09da1959953395
package.json の dependencies には含まれてるので普通に npm や yarn で install した場合は glob も入るので使えます
Node.js に組み込んだ物を使う場合には glob が使えないだけのようです
Node.js はデフォルトだと最低限の機能だけでちょっとしたことでも npm パッケージが必要になったりするのでこういうふうによく使われる便利機能はデフォルトで含んでくれるといいですね
ただ 反対意見ではコミュニティでメンテするコストについて言及してる人もいたので Python みたいに基本なんでも入ってるというようにするのは難しいのかもしれません
rimraf を入れたり OS コマンドを直接呼び出したりの手間が省けます
内部的には 1 から実装してるのかとおもいきや rimraf をそのまま取り込んだようです
https://github.com/nodejs/node/pull/29168
経緯はこっちの方が詳しいです
https://github.com/nodejs/node/pull/28208
ファイルシステムにふれる部分で OS 固有の問題もあったりして rimraf は昔から一番使われてるものでそういうところの対処もされているのでそのまま使うのが良いという判断のようです
並列処理的なところでも C++ でするより Node.js レベルでやったほうが libuv のイベントループでの非同期処理で並列実行できてパフォーマンスが良いみたいです
名前については fs.rmdir とは別に shutil を作ることが提案されてましたが すでに shutil って名前のはパッケージはあったり 新しいパッケージを作ることは反対の人が多いようです
個人的にも Python で shutil が分かれてるのは使いやすいと思ってないので fs にまとめてくれてよかたです
rmdir は OS コマンド的にはフォルダを消すものでファイルは削除しません
動作的には rm -rf です
なので混乱するから rmdir じゃないほうが良いという意見も出てますが Node.js だと通常のファイル削除が rm じゃなくて unlink ですでにコマンドと違います
なので rmtree という新しい関数名も出てますが 結局 rmdir に引数追加で決まったようです
rmdir の反対意見には その機能があることを検出できないというのもありました
mkdir のときに 今のバージョンが mkdir に recursive が有効なのかどうかを Node.js の内部で見分ける方法がなくてそれがほしいという意見もでていたそうです
たぶん polyfill 用だと思います
ただそれを理由で rmdir に入れるのをやめるほどじゃないみたいな意見もあって 入れるなら process.features とかに追加すれば良いと言う感じでした
process.features はドキュメントにもなってないようで そんなのあるなんて全然知らなかったです
ただ 見てみても余り情報はなかったです
12.10 での結果です
> process.features
{
inspector: true,
debug: false,
uv: true,
ipv6: true,
tls_alpn: true,
tls_sni: true,
tls_ocsp: true,
tls: true,
cached_builtins: true
}
mkdir のときと違って rmdir の引数にオプションの数が増えたので検出自体は関数の length プロパティを見ることでできるようです
あとは rimraf 自体は glob パッケージに依存していて foo/* みたいなので削除できるようです
ただ glob は含めず rmdir に rimraf の機能だけを入れたいのでここをどうするかも問題となっていました
それも作者が glob は必須じゃないよう対応してくれて無事リリースされたようです
rimraf は 2.7.0 から glob はあるときだけ使うようにして ないのに使おうとしたらエラーがでるようになりました
https://github.com/isaacs/rimraf/commit/dc1682d546114fd042f90e57af09da1959953395
package.json の dependencies には含まれてるので普通に npm や yarn で install した場合は glob も入るので使えます
Node.js に組み込んだ物を使う場合には glob が使えないだけのようです
Node.js はデフォルトだと最低限の機能だけでちょっとしたことでも npm パッケージが必要になったりするのでこういうふうによく使われる便利機能はデフォルトで含んでくれるといいですね
ただ 反対意見ではコミュニティでメンテするコストについて言及してる人もいたので Python みたいに基本なんでも入ってるというようにするのは難しいのかもしれません