📦
Dropbox on File Provider で node_modules を自動で除外する
Dropboxはファイル同期ツールとして優れていますが、開発プロジェクトを同期すると、以下の問題が発生します:
-
node_modules
のような大量のファイルを含むディレクトリは、同期に非常に時間がかかる。 - Dropboxのストレージ容量を圧迫する。
- CPU使用率とネットワーク帯域幅が増加し、PCのパフォーマンスに影響を与える。
正直File Providerを使うメリットがいまいちわからないのですが、今後はこれが標準になる?のかと思い、ついでだから勝手にIgnoreしてもらおう。という魂胆です。
開発ファイルをDropboxに突っ込んでるのは怠惰な生き物なので勝手にMac間で同期しててほしいだけです。
さて、macOSの 拡張属性(xattr)を利用することで、特定のディレクトリをDropboxの同期対象から除外 できます。
今回はこれを fswatch
で自動化 し、node_modules
フォルダが作成されるたびに自動で同期を無効化する方法を紹介します。
解決策
1. 監視スクリプトの作成
以下のBashスクリプトは、Dropboxフォルダ内の node_modules
を検出すると、自動的に同期対象から除外します。
やたらめったらLog貯まるのも嫌だし、Ignoreしてるのに何度もIgnoreやってる?ようなのでちょっと冗長になってます。間違ってるかも🤔
#!/bin/bash
# Dropboxディレクトリのパス
DROPBOX_DIR=~/Library/CloudStorage/Dropbox
# ログファイルのパスと設定
LOG_FILE="${HOME}/dropbox-ignore.log"
MAX_LOG_DAYS=7
# すでに処理済みのフォルダを記録する一時ファイル
PROCESSED_DIRS="${HOME}/.dropbox_ignored_dirs"
touch "$PROCESSED_DIRS"
# ログローテーション機能
rotate_logs() {
if [ -f "$LOG_FILE" ]; then
find "$LOG_FILE" -mtime +$MAX_LOG_DAYS -exec rm {} \;
fi
if [ -f "$LOG_FILE" ] && [ $(stat -f%z "$LOG_FILE") -gt 10485760 ]; then
mv "$LOG_FILE" "${LOG_FILE}.$(date +%Y%m%d)"
fi
}
rotate_logs
# 日付付きでログを記録する関数
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}
log_message "スクリプト開始: Dropbox内のnode_modulesフォルダを監視します"
# fswatch でディレクトリを監視
fswatch -0 -r "$DROPBOX_DIR" | while read -d "" event
do
if [[ "$(basename "$event")" == "node_modules" ]]; then
if grep -q "^$event$" "$PROCESSED_DIRS"; then
continue
fi
IGNORE_ATTR=$(xattr -p com.apple.fileprovider.ignore#P "$event" 2>/dev/null)
if [[ "$IGNORE_ATTR" == "1" ]]; then
echo "$event" >> "$PROCESSED_DIRS"
continue
fi
xattr -w com.apple.fileprovider.ignore#P 1 "$event"
echo "$event" >> "$PROCESSED_DIRS"
log_message "無視設定適用: $event"
rotate_logs
fi
done
スクリプトの保存と実行権限の付与
-
~/scripts/dropbox-node-modules-ignore.sh
として保存 - 実行権限を付与
chmod +x ~/scripts/dropbox-node-modules-ignore.sh
2. システム起動時に自動実行
plistを作る方法もありますが、
システム環境設定→一般→ログイン時に開く
に登録する方がよっぽど楽です。
fswatch
とは?
fswatch
は、macOS/Linux向けの ファイル変更監視ツール です。
このスクリプトでは、Dropboxディレクトリをリアルタイムで監視し、新しい node_modules
フォルダが作成されたら即座に同期対象から外します。
fswatch
のインストール
macOSではHomebrewでインストールできます。
brew install fswatch
留意点
-
fswatch
の導入が必要-
fswatch
をインストールしていない場合、スクリプトは動作しません。
-
-
スクリプトの動作確認
-
fswatch
が適切に動作しているか、まずは手動で./dropbox-node-modules-ignore.sh
を実行してチェックしてください。
-
Discussion