npm script で一部の素材ファイルやディレクトリをまるごとコピーするのに便利な cpx だが、すでに6年も更新されておらず、最近になって npm audit に警告がでるようになった。
流石に6年放置は修正が期待できないので代替案を考えた。
以下は私のプロジェクトで利用しているスクリプト例(webfont用のファイルをコピーしている)
これをベースに書き換えを行ってみる。
"font": "cpx -C \"./dev/assets/fonts/*\" \"./public/assets/fonts\"",
"watch:font": "cpx -C \"./dev/assets/fonts/*\" \"./public/assets/fonts\" -w",
1. cpコマンドを使う
{
"font": "cp -r ./dev/assets/fonts ./public/assets/fonts"
}
私がWindows派なのでなので却下(※)
※実はGowというものをインストールしているのでcpを含めたlinuxコマンドが使えるが、第三者の利用や環境が変わる可能性を考慮して却下。
2. fsモジュールを使う
{
"font": "node -e \"require('fs').cpSync('./dev/assets/fonts', './public/assets/fonts', {recursive: true}))\""
}
基本に立ち返りNode.jsの機能でやってしまえと。
ググるとよく fs-extra を利用するケースが散見されるが、ただコピーするだけならこれで十分。
wオプションの代替に onchange を使う
マニュアルどおりに記載すれば良い
{
"watch:font": "onchange \"./dev/assets/fonts/*\" -- npm run font"
}
番外:コピーする前にdistディレクトリを削除する
fs.cpSync
では上書きコピーするだけで、削除に対応できない。
source側で削除されたファイルに対応するには以下のように記述すれば良い。
{
"font": "node -e \"require('fs').rm('./public/assets/fonts', {recursive: true, force: true}, () => {require('fs').cpSync('./dev/assets/fonts', './public/assets/fonts', {recursive: true})})\""
}
ちょっとコマンドが長くなるのが気になるなら、外部ファイルから実行するか、コマンドを分けて順次実行しても良い。
以下は後者の例(npm-run-all の run-s
を利用しても良い)
{
"prefont": "node -e \"require('fs').rmSync('./public_html/static/fonts', {recursive: true, force: true})\"",
"font": "node -e \"require('fs').cpSync('./dev/_assets/fonts', './public_html/static/fonts', {recursive: true})\""
}