web-dev-qa-db-ja.com

ルートワークスペースのpackage.jsonに依存関係を追加すると、yarnが警告するのはなぜですか

ワークスペースプロジェクトのルートに依存関係を追加するときはいつでも:

例えば.

yarn add assets-webpack-plugin -D

次のエラーが発生します。

このコマンドを実行すると、ワークスペース自体ではなく、ワークスペースルートに依存関係が追加されます。これは意図したものではない可能性があります。本当に意味がある場合は、-Wフラグ(または--ignore-ワークスペースルートチェック)。

代わりに、それを必要とするすべてのプロジェクトに追加すると、各プロジェクトに異なる依存関係とロックファイルがあるという問題が発生します。

9
dagda1

Yarn Workspaces を使用しており、すべてのプロジェクト(ワークスペース)の依存関係を管理するため、各プロジェクトの依存関係を追加する必要がありますワークスペースのルートではなく、独自のpackage.jsonに。 Yarnは、ワークスペースのルートに配置されたoneyarn.lockファイルのみを使用します。また、すべてのプロジェクトの依存関係をワークスペースルートのnode_modulesに移動して、重複をできるだけ防止しようとします。一部の依存関係は、独自のプロジェクトのnode_modulesに配置する必要があります。例えばワークスペースのルートにdevDependencyから[email protected]までがあり、プロジェクトが別のバージョンの同じパッケージに依存している場合、互換性のない1.2.5と言います。ワークスペースのディレクトリ構造が次のようであるとします。

├── workspace-root
|   ├── package.json
|   ├── workspace-a
|   |   ├── package.json
|   ├── workspace-b
|   |   ├── package.json

ワークスペースルートまたはワークスペースディレクトリでyarnを実行すると、次のディレクトリ構造になります。

├── workspace-root
|   ├── node_modules
|   ├── package.json
|   ├── yarn.lock
|   ├── workspace-a
|   |   ├── package.json
|   |   ├── node_modules
|   ├── workspace-b
|   |   ├── package.json
|   |   ├── node_modules

ワークスペースのルートからスクリプトを実行する必要があり、依存関係が必要な場合にのみ、ワークスペースのルートに依存関係を追加します。この場合、プロジェクトはその依存関係から独立しているので、その警告は無視できます。

なぜ糸は警告するのですか?

プロジェクトの共通の依存関係をワークスペースのルートに追加した場合、プロジェクトのpackage.jsonには含まれません。したがって、プロジェクトを分離しても、プロジェクトのすべての依存関係が独自のpackage.jsonに含まれるわけではないため、分離されたプロジェクトに対してyarn installを実行すると、独自のnode_modulesにすべての依存関係が含まれなくなります。明らかに、分離されたプロジェクトは機能せず、問題を解決するには依存関係の問題を修正する必要があります。

糸のワークスペースの詳細

糸ワークスペースは、相互に関連するプロジェクトの依存関係を簡単に管理するための機能です。たとえば、プロジェクトに同様の依存関係がある場合、各プロジェクトをワークスペースとして宣言できます。それは多くの重複を防ぎます。別の重要な使用例はmonoreposです。

プロジェクトを複数のパッケージに分割しようとした人は、一度に複数のパッケージに変更を加えることがいかに難しいかを知っています。プロセスを簡単にするために、一部の大規模プロジェクトでは、monorepoアプローチ、またはマルチパッケージリポジトリを採用しました。これにより、パッケージ間でコードを記述する負担が軽減されます。

JavaScript開発者が毎日使用するいくつかのプロジェクトは、monoreposとして管理されています:Babel、React、Jest、Vue、Angular。

糸ワークスペースを使用すると、次の利点があります。

  • これにより、yarn installを1回実行するだけですべてのパッケージを1回のパスでインストールできるように、複数のパッケージをセットアップできます。
  • 依存関係をリンクすることができます。つまり、ワークスペースは相互に依存することができ、常に利用可能な最新のコードを常に使用できます。

  • これは、システム全体ではなくワークスペースツリーにのみ影響を与えるため、yarn linkよりも優れたメカニズムです。

  • プロジェクトのすべての依存関係が一緒にインストールされ、Yarnがより適切に最適化できるようになります。

  • Yarnはプロジェクトごとに異なるロックファイルではなく単一のロックファイルを使用します。つまり、競合が少なくなり、レビューが容易になります。

7
Abdollah

Package.jsonで「ワークスペース」が宣言されている場合。ワークスペースを選択し、セットアップが正しい必要があります。これは、mono-repoを使用している場合にのみ意味があるように見えます。これに関係しているので、mono-repoは「ルート」package.jsonを持つ1つの大きなリポジトリで、ワークスペースとdev依存関係が宣言されています。その中には他の「パッケージ」があります(独自のpackage.jsonを持つプロジェクトですが、独自のリポジトリはありません)。

これらの「ワークスペース」( https://yarnpkg.com/lang/en/docs/workspaces/ を参照)または「パッケージ」にパッケージを追加する必要があり、ルートフォルダーから作業している場合、Yarnアクションのターゲットとするワークスペースを指定する必要があります。

ルートの開発依存である場合、これは問題ではありません。 「ルート」プロジェクトには独自の「本番」依存関係がなく、ワークスペースにのみ存在することが想定されているためです。開発依存ではなく、ワークスペースを指定しない場合( https://yarnpkg.com/en/docs/cli/workspace )、警告が表示され、オーバーライドする方法が表示されます。

4
rainabba