
npm run スクリプトに引数を渡す方法
#Nodejs#Javascript✎ 2021-12-16引数を npm run のスクリプト(npm-run-script)に渡して動的な処理をしたいことがありましたので、方法をサンプルコード付きで備忘しておきます
nodejs 上で動く javascript で、指定したディレクトリを丸々、別の場所にコピーしたい場合があります。
再帰的に、かつ nodejs の標準機能のみで実現したコードを参考として載せておきます。
なお、このブログは React ベース(Gatsby)で記述していますが、
新しい記事を作成するときはテンプレート一式のフォルダを npm run xxxx
コマンドでコピー作成することで簡単に書けるようにしており、そのコピー作成などにも今回のコードは使用しています。
以下は指定したパス(ディレクトリ)を、目的の場所に再帰的にコピーする関数 CopyFilesRecursively
を定義して、テストとして呼び出したものです。
/**
* 再帰的にパス配下のファイル・フォルダ一覧を取得
* @param {string} targetpath 探索する対象のパス
* @param {number} depth 探索する深さ。オプション。デフォルトは指定なし。
* @returns 取得したファイル、ディレクトリの{path:絶対パス, isDir:ディレクトリか} を配列で返す
*/
var GetFilelistRecursively2 = ((targetpath, depth = -1) => {
let result = [];
var dirs = fs.readdirSync(targetpath);
dirs.forEach(file => {
let filepath = targetpath + "/" + file;
let isDir = fs.lstatSync(filepath).isDirectory();
result.push({path:filepath, isDir:isDir });
if ( isDir ) {
if ( depth == 0 ) return result;
result = result.concat( GetFilelistRecursively2(filepath, depth - 1));
}
});
return result;
});
/**
* 指定したパス配下のフォルダ、ファイルを同じ構造で再帰的にコピーします。
* コピー先のディレクトリが存在しない場合、フォルダが作成され、その中にコピーします。
* 権限不足や容量不足の場合、例外を検知し停止します。
* @param {string} srcpath コピー元のパス
* @param {string} destpath コピー先のパス
*/
var CopyFilesRecursively = ((srcpath, destpath) => {
if ( !fs.existsSync(destpath) ) {
fs.mkdirSync(destpath,{ recursive: true } );
}
let targetList = GetFilelistRecursively2( srcpath );
targetList.forEach( node => {
let newpath = destpath + node.path.substring(srcpath.length);
if ( node.isDir) {
if ( !fs.existsSync(destpath) ) fs.mkdirSync(newpath);
} else {
fs.copyFile(node.path, newpath, err => {if (err) throw err});
}
});
});
// 使用例
CopyFilesRecursively("C:/testdir", "C:/testdir2");
二つの関数である GetFilelistRecursively2
と CopyFilesRecursively
を定義しています。
フォルダをコピーするときは後者の CopyFilesRecursively
を呼び出します。
コードの中で、コピー元のファイルやフォルダの一覧を再帰的に取得し、その後に 指定した先のパスに構造をコピーしています。
なお、GetFilelistRecursively2
はファイルやフォルダの一覧を取得する関数であり、
他の記事コチラで作成したものを使用しています。
興味がありましたら、そちらもご参照ください。
日付 | 変更概要 |
---|---|
なし |
コメント、ありがとうございます。
ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。
Twitter:@NodachiSoft_jpお名前:以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください
お名前: