今回自身で作成しているプロジェクトのバックアップを取ろうと思った時につまずいた内容を整理したいと思います。node.jsで作成していたディレクトリで、node_modules群で特に.ファイルが邪魔をしていたことが発覚しました。
発生した問題
MacのFinderでNode.jsプロジェクトをフォルダごとコピーしようとしたところ、以下のエラーが発生した。
一部のデータを読み込めないか書き込めないため、操作を完了できません。
(エラーコード -36)
また、コピー途中で以下のようなメッセージが表示された。
"〇〇フォルダのコピー" のコピーを一時停止しました
当初考えた原因
エラーコード -36 は一般的に以下の原因が考えられる。
- 外付けSSDやUSBの不具合
- Mac特有の隠しファイル(._ファイル)
- Finderの不具合
- ディスクエラー
- ファイルの破損
そのため最初は dot_clean コマンドの利用も検討した。
dot_clean フォルダ名
しかし今回はMac内部ストレージ同士のコピーであり、外部ストレージではなかったため可能性は低かった。
本当の原因
Node.jsプロジェクト内に存在していた
node_modules
が原因だった。
Finderは大量の小さなファイルをコピーするのが苦手で、
node_modules
のような数万ファイル規模のフォルダを扱う際に停止したり、エラーコード-36を発生させることがある。
解決方法
Finderではなくターミナルの rsync を利用した。
rsync -avh \
--exclude=node_modules \
--exclude=.pm2 \
~/Desktop/test/ \
~/Desktop/test_backup/
オプションの意味
-a
属性を保持してコピー
-v
詳細表示
-h
見やすいサイズ表示
--exclude=node_modules
node_modulesを除外
--exclude=.pm2
PM2の実行キャッシュを除外
コピー後の復元方法
コピー先で以下を実行する。
cd ~/Desktop/test_backup
npm install
これにより package.json をもとに必要なライブラリが再インストールされる。
その後起動確認。
npm run dev
または
npm start
学んだこと
今回の件で理解できたこと。
- FinderはNode.jsプロジェクトの大量ファイルコピーに弱い
- エラーコード-36は必ずしもSSD故障ではない
- rsyncは開発者がよく使う安全なコピー方法
- node_modulesは資産ではなくキャッシュに近い存在
- package.json があれば環境を再構築できる
今後の自分用メモ
Node.jsプロジェクトをコピーする時はFinderを使わない。
まず以下を実行する。
rsync -avh \
--exclude=node_modules \
--exclude=.pm2 \
コピー元/ \
コピー先/
コピー後は
npm install
で復元する。
これを標準手順とする。


コメント