web-dev-qa-db-ja.com

npm / yarnインストール中の「リンクの依存関係」は実際に何をしますか?

大規模なWebアプリの場合npm installそれぞれyarn installには多くの時間がかかります。ほとんどの場合、Linking Dependencies。ここで何が起きてるの?依存関係の依存関係を取得していますか?それとも完全に異なるものですか?このステップでどのファイルが作成されますか?

22
Zardoz

yarn installを呼び出すと、次のことが順番に発生します。

  1. Resolution:Yarnは、レジストリに要求を行い、各依存関係を再帰的に検索することにより、依存関係の解決を開始します。

  2. Downloading/Fetching:次に、Yarnはグローバルキャッシュディレクトリを調べて、必要なパッケージが既にダウンロードされているかどうかを確認します。そうでない場合、Yarnはパッケージのtarballを取得し、グローバルキャッシュに配置します。これにより、オフラインで動作し、依存関係を複数回ダウンロードする必要がなくなります。依存関係は、完全なオフラインインストール用のtarballとしてソース管理に配置することもできます。

  3. リンク:最後に、Yarnは、既に存在するものと存在しないものを特定した後、必要なすべてのファイルをグローバルキャッシュからローカルnode_modulesディレクトリにコピーすることにより、すべてをリンクします。


yarn installには多くの時間がかかります。主にLinking Dependenciesと呼ばれるステップで

Step 3: Linkingは、実際のダウンロードが発生するStep 1: ResolutionおよびStep 2: Fetchingよりも時間がかかることに注意してください。このステップでは、準備とダウンロードが必要なものが既にありますが、なぜ時間がかかるのですか?

はい、[〜#〜] copy [〜#〜]ローカルプロジェクトをnode_modulesフォルダーに......!この理由は、このコピーが1つの大きな4.7GB ISOファイルのコピーと同等ではないためです。代わりに、複数の非常に小さなファイルです(複数と言うときは軽くしないでください、15k +ファイル:Pになる可能性があります)。したがって、コピーに時間がかかります。 (また、パッケージをダウンロードするとき、パッケージごとに1つの大きなtarファイルをダウンロードすることに注意することが重要です。そのファイルはキャッシュに抽出されるので、時間がかかります)

により遅い

  • Anti-virus:ウイルス対策はすべてのファイルで真ん中にあり、(既に存在するかどうかのヤーンチェックに加えて)迅速な検査を行っていますヤーンはコピー速度を大幅に削減しようとしています。 Windowsを使用している場合は、Windows Defenderの例外としてプロジェクトの親フォルダーを追加してみてください。
  • ストレージメディアの転送速度:SSDはこの速度を大幅に向上させることができます(申し訳ありませんが、SSHDとFireCudaは役に立たないでしょう、これは一度になるでしょう)。

しかし、これは効率的ですか?グローバルnode_modulesから取得できますか(作成後)?

両方の質問にいいえ。ノードが機能する方法のため、各パッケージは、自身の場所に関連する依存関係のみを見つけます。また、各プロジェクトは同じパッケージの異なるバージョンを使用して、適切に動作し、パッケージの更新によって破損しないようにする必要がある場合があります。

理想的には、プロジェクトフォルダは無駄のないものでなければなりません。これを行う効率的な方法は、globalnode_modulesフォルダーを持つことです。要求されたパッケージがまだ存在しない場合はダウンロードされ、この場所から使用されます。実際、Rubyはこのようにします。ここに私のグローバルRubyに相当するnode_modulesフォルダーがあります。異なるプロジェクトで使用する同じパッケージの異なるバージョンが存在することに注意してください。

enter image description here

ただし、プロジェクトの移植性が低下することに注意してください。これは、マネージャー(rubygemsまたはノードモジュール)が行う必要のあるトレードオフです。ノードプロジェクトフォルダーをコピーするだけです((ローカル)node_modulesフォルダーもコピーするため、実際には数時間かかることがありますが、そのプロジェクトフォルダーだけがあれば、それが機能することを期待できます) Rubyプロジェクトは数秒から数分になります。ローカルパッケージ(またはそれらを呼び出すGem)フォルダーがないためですが、異なるシステムでプロジェクトを実行するにはこれらのパッケージが必要です。グローバルgemsフォルダーに存在します。

リンクフェーズは、基本的に3つの大きなステップで機能します。

  1. Node_modulesにある必要があるすべてのファイルを検索します
  2. このリストと既にあるものをチェックし、キャッシュからnode_modulesにコピーする必要があるものを見つけます
  3. コピーをする

たぶん、Githubのこの問題はあなたを助けるでしょう。

https://github.com/yarnpkg/yarn/issues/1496

0
Kenchopa