まくまくNode.jsノート
npm run のスクリプトの中でファイルのコピーを行う (cpx)
2019-10-05

OS 依存のコピーコマンドでファイルコピーする方法

package.jsonscripts プロパティでスクリプトを定義しておくと、任意のコマンドを npm run コマンド経由で実行できるようになります。

このスクリプト定義は便利なので、例えば、下記のようにファイルのコピーや削除を行うスクリプトを定義したくなるかもしれません。

package.json

{
  "scripts": {
    "copy": "xcopy /S /H /Y static\\** build\\"
  }
}

この copy スクリプトを下記のように実行すると、static ディレクトリ内のファイルが build ディレクトリにすべてコピーされます。

D:\> npm run copy

しかし、xcopy コマンドは Windows のコマンドなので、Linux などで同様のことを行うためには、下記のように別のスクリプトを用意しなければいけません。

{
  "scripts": {
    "copy-win": "xcopy /S /H /Y static\\** build\\",
    "copy-linux": "mkdir -p ./build && cp -pR ./static/* ./build"
  }
}

Toru Nagashima さんの作成した cpx という NPM パッケージを使用すると、ファイルのコピー処理を汎用的に記述することができます。 同様のことを行える copyfiles という NPM パッケージもあるのですが、ここでは使い方がよりシンプルな cpx を採用することにします。

cpx パッケージを使ってファイルコピーする方法

NPM のパッケージとして公開されている cpx コマンドを使用すると、OS に依存しないファイルのコピーを行うことができます。 cpx を使用すると、グロブ形式でコピーするファイルを指定できたり、コピー先のディレクトリを自動生成してくれたりします。

cpx は下記のように開発用のコマンドとしてインストールしましょう。

$ npm install --save-dev cpx

これにより、ローカルの node_modules/.bin ディレクトリに cpx コマンドがインストールされ、package.jsondevDependencies プロパティに依存関係情報も追加されます。 cpx コマンドは、package.json で定義するスクリプト内から下記のように呼び出すことができます。

packages.json (OS に依存しない copy スクリプトの定義)

{
  "scripts": {
    "copy": "cpx -C static/** build"
  }
}

cpx コマンドの実体は、node_modules/.bin ディレクトリ以下にインストールされているのですが、npm 実行時にこのディレクトリに自動的にパスが通るようになっているので、上記のようにコマンド名だけを直接指定できるようになっています。 これで、次のように実行するだけで、static ディレクトリ内のファイルを build ディレクトリに丸ごとコピーできます。

$ npm run copy

ここでは cpx-C オプションを指定していますが、このオプションを指定すると、コピー元に存在しないファイルが、コピー先のディレクトリから削除されます(ゴミファイルが残るのを防げます)。 明示的にディレクトリを削除したい場合は、rimraf を使用してディレクトリを削除 するようにしましょう。

2019-10-05