web-dev-qa-db-ja.com

OneDrive同期からnode_modulesディレクトリを除外する方法は?

私はフロントエンドデベロッパーであり、フロントエンドプロジェクトをOneDriveに保持しています。 Node.jsが依存関係を整理する方法により、各プロジェクトにはnode_modulesディレクトリには、同期に永久に時間がかかる数十メガバイトの小さなファイルがあります。

同期を回避するにはどうすればよいですかnode_modulesディレクトリをプロジェクトをOneDriveに保持しますか?

13
Ivan Akulov

これは古い質問であることはわかっていますが、同じ問題に遭遇しました。私が遭遇した解決策は、最初に空の_node_modules_フォルダーを作成し、それをクラウドと同期することでした。

空のフォルダが同期されると、次に入りました

OneDriveの設定→フォルダーを選択

_node_modules_フォルダの選択を解除しました。

次に、プロジェクトルートフォルダーで_npm install_を実行すると、OneDriveがクラウド内のフォルダーのコンテンツとの競合を検出します。同期しません。

Image of Sync Error

このアプローチの欠点は、OneDriveが同期エラーを生成することですが、私のニーズにはうまく機能しているように見えました。

9
clurd

バックグラウンド

OneDriveは名前でディレクトリを除外することを許可していません。これは すぐには変更されません

[UserVoiceリクエストに対するOneDriveの代表的な応答:]現在はありません

一部のユーザーが推奨 OneDrive設定で同期したくないディレクトリのチェックを外しますが、 OneDriveファイルオンデマンド で不可能になりました。

解決

ただし、Node.js側で調整することでこれを解決できます。 node_modulesディレクトリを別の場所へのfileシンボリックリンクにします。

# Open any place outside OneDrive
cd D:\node_dependencies
# Make a symlink target. After linking, node_modules for your project 
# will be installed here
mkdir node_modules_for_my_project

# Open the project directory
cd <the project directory>
# Make a *file* link from node_modules to the newly created directory.
# You will need to delete existing node_modules directory if it exists
cmd /C "mklink node_modules D:\node_dependencies\node_modules_for_my_project"

ここで重要なのは、ディレクトリではなく、ファイルシンボリックリンクを作成することです1。 OneDriveはこのシンボリックリンクを認識して同期しませんが、Node.jsは意図したとおりに動作します。

A screenshot showing that npm install and Node.js’s require work as intended

OneDrive v17.3.7101.1018でテストされ、オンデマンドのOneDriveファイルが有効になっています。

欠点

これは普遍的な解決策ではありません。これの欠点は、エクスプローラ、Powershell、およびその他のツールがnode_modulesをディレクトリとして認識しないことです。

A screenshot showing that Explorer shows node_modules as an unrecognized file with a shortcut icon

ただし、Node.jsベースのコードエディターはそれを問題なく読み取ります。

Screenshot of Visual Studio code with node_modules directory expanded

8
Ivan Akulov

TypeScriptユーザーの場合は、モジュール解決の問題を回避するために、node_modulesをパスに追加します。

Tsconfig.jsonに次を追加します。

"paths": {
  [... some paths ...],
  "*": [
    "node_modules/*"
  ]
}

編集:まだいくつかの問題があります。プロジェクトをビルドできますが、ts-nodeとnodemonが起動しますCannot find moduleエラー。さて、これはまだ問題です:(

1
Pierrick Bignet

最善の解決策は、プロジェクトが保存され、モジュールがインストールされるOneDriveフォルダーの外に「ローカル」フォルダーを作成することです。これが実際のプロジェクトです。

OneDriveに同期するには、手動で「parallel」フォルダーを作成し、「RoboCopy」を使用して必要なコンテンツのみをコピーします。その後、このタスクをスケジュールできます。

無視するファイルとフォルダの名前/ワイルドカードは.gitignoreファイルからコピーされました

ソリューションはいくつかの記事に基づいています:

RoboCopyタスクのスケジュールと簡単な例

MicrosoftのRoboCopyドキュメント

gUIを使用して、スケジュールする.batタスクファイルを作成することもできます。 MicrosoftのGUIChoEazyCopy GUIの方が優れています

1
RanST