package.json の scripts プロパティでスクリプトを定義しておくと、任意のコマンドを npm run コマンド経由で実行できるようになります。
このスクリプト定義は便利なので、例えば、下記のようにファイルのコピーや削除を行うスクリプトを定義したくなるかもしれません。
{
"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 を採用することにします。
NPM のパッケージとして公開されている cpx コマンドを使用すると、OS に依存しないファイルのコピーを行うことができます。
cpx を使用すると、グロブ形式でコピーするファイルを指定できたり、コピー先のディレクトリを自動生成してくれたりします。
cpx は下記のように開発用のコマンドとしてインストールしましょう。
$ npm install --save-dev cpx
これにより、ローカルの node_modules/.bin ディレクトリに cpx コマンドがインストールされ、package.json の devDependencies プロパティに依存関係情報も追加されます。
cpx コマンドは、package.json で定義するスクリプト内から下記のように呼び出すことができます。
{
"scripts": {
"copy": "cpx -C static/** build"
}
}
cpx コマンドの実体は、node_modules/.bin ディレクトリ以下にインストールされているのですが、npm 実行時にこのディレクトリに自動的にパスが通るようになっているので、上記のようにコマンド名だけを直接指定できるようになっています。
これで、次のように実行するだけで、static ディレクトリ内のファイルを build ディレクトリに丸ごとコピーできます。
$ npm run copy
ここでは cpx の -C オプションを指定していますが、このオプションを指定すると、コピー元に存在しないファイルが、コピー先のディレクトリから削除されます(ゴミファイルが残るのを防げます)。
明示的にディレクトリを削除したい場合は、rimraf を使用してディレクトリを削除 するようにしましょう。