【npm-scripts】rimrafを使わず、ディレクトリを丸ごと削除するメモ。

 JavaScriptで書かれたコードを細分化する上で、どうしてもTypeScriptの型が欲しくなったのでそのメモ書き。

 npm-scripts を使って "npm run clean" としてトランスパイルしたディレクトリを丸ごと消してしまいたい時がある。そんなときによく挙げられるライブラリに「rimraf」がある。"npm install --save-dev rimraf" で入れてちゃっちゃとやってしまいたいが、ライブラリ依存はなんか腑に落ちない方も一定数?そんな方に向けたメモ。

実行環境


$ node -v
v18.12.1

$ npm -v
8.19.2

$ ver
Microsoft Windows [Version 10.0.22000.1455]

script 実行用ファイルの作成


 やり方にはいくつかあるが、おおまかに。

  1.  package.json と同階層に script ディレクトリを作成し、その配下に clean.js を置く。

  2.  clean.js に fs module を用いて、ファイル操作を定義する。

  3.  package.json の "scripts" 内に、 "clean": "node script/clean" と記述する。

 ここで想定するディレクトリ構成は以下のようにした。

project/
  ├ build/
  │ └ ...
  │   // src ディレクトリ配下と同様の構成
  │
  ├ script/
  │ └ clean.js
  │
  ├ src/
  │ └ ...
  │   // build コマンドによってまるまるトランスパイル
  │
  ├ package.json
  └ tsconfig.json

 また、 script/clean.js 及び package.json は以下のようにしている。

// script/clean.js
const fs = require("fs");
const path = require("path");
const buildPath = path.resolve(__dirname, '../build');

(async () => {
  try {
    await fs.promises.rm(buildPath, { recursive: true });
    await fs.promises.mkdir(buildPath);
    console.log(`clean: ${buildPath}`);
  } catch (error) {
    if (error.code = 'ENOENT') {
      await fs.promises.mkdir(buildPath);
      console.log(`mkdir: ${buildPath}`);
    } else {
      console.log(error);
    }
  }
})();
// package.json
{
  //...

  "scripts": {
    "clean": "node script/clean",

  //...
}
$ npm run clean

> project@1.0.0 clean
> node script/clean

clean: C:\Users\xxx\project\build

 これにより、 build ディレクトリが丸ごと削除される。 Node.js API を用いているため、恐らく OS による差異はないと予想(未検証)。

コピペは注意! 検証込みで、あくまで自己責任で。

tmp ディレクトリへの応用


 tmp ディレクトリといえば、一般的には一時保存用ディレクトリを指す。tmp ディレクトリをまるっとスッキリさせたいときに便利なやつを予め定義しておく。

  src ディレクトリ配下に tmp ディレクトリ、及び util ディレクトリ(便利なやつを入れるところ)を作成する。 util/tmp.js には以下のように書く。

// src/util/tmp.js
const fs = require("fs");
const path = require("path");
const tmpPath = path.resolve(__dirname, '../tmp');

const tmp = {};
tmp.path = tmpPath;
tmp.clean = async () => {
  try {
    await fs.promises.rm(tmpPath, { recursive: true });
    await fs.promises.mkdir(tmpPath);
  } catch (error) {
    if (error.code = 'ENOENT') {
      await fs.promises.mkdir(tmpPath);
    } else {
      console.log(error);
    }
  }
}

module.exports = tmp;

 これで tmp.clean() と呼び出すだけで tmp ディレクトリはもぬけの殻となる。


この記事が気に入ったらサポートをしてみませんか?