Zenn
📦

Dropbox on File Provider で node_modules を自動で除外する

2025/03/21に公開

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

スクリプトの保存と実行権限の付与

  1. ~/scripts/dropbox-node-modules-ignore.sh として保存
  2. 実行権限を付与
chmod +x ~/scripts/dropbox-node-modules-ignore.sh

2. システム起動時に自動実行

plistを作る方法もありますが、
システム環境設定→一般→ログイン時に開く
に登録する方がよっぽど楽です。


fswatch とは?

fswatch は、macOS/Linux向けの ファイル変更監視ツール です。
このスクリプトでは、Dropboxディレクトリをリアルタイムで監視し、新しい node_modules フォルダが作成されたら即座に同期対象から外します。

fswatch のインストール

macOSではHomebrewでインストールできます。

brew install fswatch

留意点

  1. fswatch の導入が必要

    • fswatch をインストールしていない場合、スクリプトは動作しません。
  2. スクリプトの動作確認

    • fswatch が適切に動作しているか、まずは手動で ./dropbox-node-modules-ignore.sh を実行してチェックしてください。

Discussion

ログインするとコメントできます