MacのDropboxでnode_modulesを同期させないカンタンな方法【Automatorワークフロー無料公開】

Takashi Fujisakiのアバター
6550文字
悩んでいる人

DropboxでMacの開発データを同期したいんだけど、node_modules フォルダだけ同期させないようにしたいんだよね。たくさんのプロジェクトを抱えてるから大変なのですよ。もう、めっちゃカンタンな方法ないかな。

Mac & Dropboxユーザーな開発者の皆さまこんにちは。突然ですが、node_modules の呪いに悩まされていませんか?いますよね?ですよね!気づいたら100,000ファイル同期中とかなってて焦りますよね!なんとかこの node_modules フォルダを同期しないようにできないもんですかね。しかもカンタンに。

というわけで今回は node_modules フォルダを同期させない簡単な方法をご紹介します。また、ワンクリックで同期を無効にできるAutomatorワークフローも配布します。ぜひ最後まで読んでみてください。よろしくどうぞ。

この記事を読むメリット

checkDropbox node_modules同期問題から解放される!

checkDropboxの同期無視のしくみについての理解が深まる

checkMacの新機能 File Providerについての理解が深まる

checkワンクリックでnode_modulesを同期無視できるAutomatorワークフローをゲットできる!

忙しい人はココまで飛ばしてください

node_modules を同期から除外できないものか…

Dropboxに同期されると面倒なnode_modules

.gitignore みたいなノリで、node_modules をDropboxの同期から除外できないもんですかねぇ。というのはもうかれこれ何年も悩まされてきたものですが、いろいろと考えた末に、現在僕が使っている、できるだけ労力を使わずに実現するための方法をご紹介します。

はじめに。選択型同期ではうまくいかない件

Dropboxのベーシックな機能に「選択型同期」というのがあります。これを使えば node_modules を無視できそうな気がしますが、残念ながらそうは問屋が下ろさないのです。

選択型同期とは、噛み砕いて言うと

Dropboxにすでにアップロードされているファイルやフォルダを、このデバイス(Mac / PC)には表示させない(同期しない)

という性質の機能。しかし、今回やりたいことは

そもそも node_modules フォルダの中身一切をDropboxにアップロードしたくない

という話です。なんせ100,000ファイルとか平気でイっちゃうので…。そんなもんDropboxにアップロードしたくないし、そもそも同期する必要もない性質のものです。

実はDropboxにはファイルやフォルダを無視する機能が用意されている…!

というわけで、選択型同期ではなく別の方法を使う必要があります。実はDropboxにはファイルやフォルダを「無視」するための機能が用意されているのです。下のの公式サイトに詳しく書いてあります。

info

2023/6/7: 上記公式サイトのMacのコマンドラインに若干の間違いがあります。当ページの修正版をお試しください。

Dropboxのフォルダを無視するためのコマンドライン

下記で紹介するコマンドをターミナルアプリで実行します。それぞれ [filename] には対象ファイル・フォルダ名に書き換えてください。絶対パスでも相対パスでもOK。

またここではMacのコマンドのみ紹介します。WindowsやLinuxのコマンドはサイトを確認ください。

macOS 12.5以降 & Dropbox for macOSを使っている場合

ファイルの同期を無視する

xattr -w 'com.apple.fileprovider.ignore#P' 1 [filename]

ファイルの同期無視を解除する

xattr -d 'com.apple.fileprovider.ignore#P' [filename]

macOS 12.3以前のMac

ファイルの同期を無視する

xattr -w com.dropbox.ignored 1 [filename]

ファイルの同期無視を解除する

xattr -d com.dropbox.ignored [filename]

コマンドラインを使って実際に同期無視をやってみる

ここではmacOS 13.1 Ventura & 新しいDropbox for macOSを例にして解説していきます。

さて、実際にやってみます。Dropboxフォルダ直下にプロジェクトフォルダのテイの「test」フォルダを作成。その中に空の node_modules フォルダを作成しておきます。

あらかじめ空のnode_modulesフォルダを作っておく
info

npm install をする前に空のnode_modules フォルダを自分で作っておくことで、一時的に node_modules が同期されてしまうのを回避できます

ターミナルでコマンドを入力します。testフォルダに移動して、直下の node_modules を同期無視します。

$ cd ~/Dropbox/test
$ xattr -w 'com.apple.fileprovider.ignore#P' 1 node_modules

コマンドを実行すると、node_modules のフォルダの横のアイコンが、雲に斜線が入ったアイコンに変わりました。これが、同期無視状態になったという目印です。

同期無視アイコンが表示されたらOK

あとはもう npm install し放題!node_modules の中身は一切Dropboxに同期されません。スッキリ!

macOS 12.5以降実装されたFile Providerについてちょっと解説

File Provider対応されたクラウドストレージはここに表示される

Macの新機能 File Provider

常に新しいOSを使っている方はすでにお気づきかもしれませんが、新しいmacOSにはFile Providerという機能が実装されています。

これは、Dropboxだけではなく、OneDriveやGoogle DriveなどのオンラインストレージとMacのFinderの連携をMac側の機能として標準化し統一させたもの。

これまでは、DropboxはDropbox、OneDriveはOneDrive側で実装された独自機能によってMacと連携されていました。

なので、機能や同期ステータスのアイコンなどもそれぞれ独自で用意されたものでした。この同期機能の一切をmacOS側で準備することで機能を標準化し、さまざまなクラウドストレージを同じ使い勝手で使えるようになった、というあんばい。

File Providerには同期無視機能が搭載されている!

ここで、先ほどのコマンドラインの中身をもう一度見てみましょう。

こちらはmacOS 12.5以降、つまりFile Provider搭載MacのDropbox同期無視コマンド。

xattr -w 'com.apple.fileprovider.ignore#P' 1 [filename]

こちらはmacOS 12.3以前、つまりFile Provider非搭載のMacのDropbox同期無視コマンド。

xattr -w com.dropbox.ignored 1 [filename]

違いが分かりますかね。はいそうです。File Providerの方には com.apple.fileprovider と書いてあります。つまりAppleが用意した機能ということを示しています。つまり、MacのFile Provider側で実装されている無視機能を利用する、ということ。

対して下の方は com.dropbox.ignored とあります。これはDropbox側が用意した機能であることを示しています。

つまり。下のコマンドはDropbox専用であるのに対し、上のコマンドはDropboxに限らずOneDriveやGoogle Driveにも同様に適用できるということなのです!

もうひとつ。File Providerによって、DropboxもOneDriveも、ファイルの同期ステータスを示すアイコンがすべて統一されています。

これらはmacOSのFile Providerによって統一化されたことによる恩恵です。便利になりました。はい。

ここがポイント

checkmacOS 12.5以降のFile Providerはさまざまなクラウドストレージとの連携機能を標準化し統一するMac側の機能

check新しいDropboxではFile Provider側の機能を利用して同期無視を実現できる

checkつまりOneDriveなど他のクラウドストレージでも同様の同期無視コマンドが使える!

さて、コマンドラインの話に戻りますが、正直こんなコマンドを毎回打ってられないのは当然で、ここはAutomatorを使って自動化しちゃいましょう。

Automatorとは、Macのさまざまなアクションを自動化するためのプログラムを自作できるアプリケーションです。こちらを使って自作サービスを作ります。

Automator アイコン
Automatorのアイコン

Automatorを起動し、「クイックアクション」を選択。

下の画像を参考に、左上の検索で「シェル」と入力、出てきた「シェルスクリプトを実行」をダブルクリックすると右側に登録されます。あとは、画像の赤枠のとおり設定しましょう。終わったら「同期を無視」とでも名前をつけて保存すればOK。

シェルスクリプトの内容はこちらをコピペしてください。

for f in "$@"
do
    xattr -w "com.apple.fileprovider.ignore#P" 1 "$f"
done

Automatorワークフローのインストール場所

ワークフローを保存すると、おそらく下記の場所に保存されると思います。Finderがアクティブな状態で command + shift + G で下記をコピペするとこのフォルダを開くことができます。

~/Library/Services
command + shift + G でFinderを移動できる

ここ以外の場所にある場合は、workflowファイルをダブルクリックすると、ファイルがこのフォルダに移動(インストール)します。

この同期無視ワークフローの使い方

インストールできたらさっそく使ってみましょう。

Dropbox直下に test2 フォルダを、さらにその直下に空の node_modules フォルダを作っておきます。

この node_modules フォルダを副ボタンクリック -> クイックアクションに、今作った「同期を無視」がありますね。こいつをクリックして実行しましょう。

アイコンが雲スラッシュになったら同期無視成功です。これで簡単にnode_modules を無視できるようになりました!

雲スラッシュアイコン

大事なことなのでもう一度言っておきますが、npm install する前に空の node_modules フォルダを作って、それにあらかじめ無視をかけておくと、一時的に大量の node_modules ファイルが同期される心配もありませんので、おすすめです。

Dropbox以外でも使えます!!!

先ほどもお話したとおり、macOS 12.5以降であれば、DropboxだけではなくOneDriveやGoogle Driveでも使えます。

warning

iCloud Driveではなぜか使えませんでした… 訳がわかりません

Automatorワークフロー共有します

というわけで、上記の同期を無視するAutomatorワークフローと、同期解除のワークフローをまとめて置いておきます。どうぞご利用ください。

ダウンロードした ignore-sync-workflow.zip を解凍すると、「同期を無視」「同期無視を解除」という2つのワークフローファイルがあります。それぞれダブルクリックするとMacにインストールされます。

ターミナルからコマンド一発で同期無視したい

さて、最後にもうひとつの方法として、ターミナルから同期無視を実行する方法をご紹介。

ここはターミナル等をある程度理解している方向けの内容なので、細かいことは割愛します。

やりたいことは、空のnode_modules ファイルを作成して同期を無視するまでをコマンド一発で行う、というもの。

.zshrc ファイルに以下を書き、di というコマンド名を定義します。

# 空のnode_modulesフォルダを作成しかつ同期を無視する
alias di="mkdir node_modules; xattr -w 'com.apple.fileprovider.ignore#P' 1 node_modules"

Macを再起動するなり source するなりして .zshrc を再読み込みしておきましょう。

あとは、プロジェクトフォルダに移動して di コマンドを実行。

$ cd path/to/project
$ di

node_modules フォルダが作成され、かつ同期無視の設定までがこの di コマンド一発で完了します。

ちなみにdiはDropbox Ignoreの略でつけましたが、前述のとおりOneDrive やGoogle Driveでも使えます。

まとめ

Dropboxからnode_modulesを無視するための方法をお伝えしてきました。このサイトの性質上Mac(の最新版)について解説させていただきましたが、Windows および Linux、macOS12.3以前をお使いの方は最新版のmacOS & Dropboxにアップデートするか、Dropbox公式サイトを参考にしてください。

ぜひこちらのAutomatorワークフローも使ってみてください。それではよきDropbox Ignore生活を!