32

每当我将依赖项添加到工作区项目的根目录时:

例如

yarn add assets-webpack-plugin -D

我收到以下错误:

运行此命令会将依赖项添加到工作区根目录而不是工作区本身,这可能不是您想要的 - 如果您真的是这个意思,请使用 -W 标志(或 --ignore-工作区根检查)。

另一种方法是将它添加到需要它的每个项目中,然后你会遇到每个项目具有不同依赖项和锁定文件的问题。

4

2 回答 2

35

由于您使用的是Yarn Workspaces并且它管理所有项目(工作空间)的依赖关系,因此您应该将每个项目的依赖关系添加到它自己的package.json,而不是工作空间根目录。Yarn 仅使用一个 yarn.lock放置在工作区根目录中的文件。此外,它尝试将所有项目node_modules的依赖关系移动到工作区根目录,以尽可能防止重复。虽然有些依赖需要放在node_modules自己的项目中;例如,当工作空间根有一个devDependencytoawesome-package@2.1.1而一个项目依赖于具有另一个版本的同一个包时,说明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。显然,分离的项目无法工作,您需要修复缺少的依赖关系问题才能解决问题。

有关纱线工作区的更多信息

Yarn Workspaces 是一项功能,旨在更轻松地管理相互关联的项目的依赖关系。例如,当您的项目具有相似的依赖项时,您可以将每个项目声明为工作区。它可以防止很多重复。另一个重要的用例是monorepos

那些尝试过将项目拆分为多个包的人都知道,一次跨多个包进行更改是多么困难。为了简化这个过程,一些大项目采用了 monorepo 方法,或多包存储库,这减少了跨包编写代码的负担。

JavaScript 开发人员每天使用的几个项目都作为 monorepos 进行管理:Babel、React、Jest、Vue、Angular。

使用 Yarn Workspaces 带来以下好处:

  • 它允许你设置多个包,这样你只需要运行一次 yarn install 就可以一次安装所有包。
  • 您的依赖关系可以链接在一起,这意味着您的工作空间可以相互依赖,同时始终使用可用的最新代码。

  • 这也是一种更好的机制,yarn link因为它只影响您的工作区树而不是整个系统。

  • 您所有的项目依赖项都将一起安装,从而为 Yarn 提供更大的自由度来更好地优化它们。

  • Yarn 将使用单个锁定文件,而不是为每个项目使用不同的锁定文件,这意味着更少的冲突和更容易的审查。

于 2018-11-30T13:46:07.390 回答
5

如果您在 package.json 中声明了“工作区”;您已选择进入工作区,并且设置必须正确。这似乎只有在您使用单一存储库时才有意义。与此相关的是,mono-repo 是一个带有“根”package.json 的大型 repo,其中声明了工作空间以及开发依赖项。里面将是其他“包”(具有自己的 package.json 的项目,但没有自己的 repo)。

当您想将包添加到这些“工作区”(请参阅​​ https://yarnpkg.com/lang/en/docs/workspaces/)或“包”并且您正在从根文件夹工作时,您必须指定您的工作区'以 Yarn 行动为目标。

如果它是根的开发依赖项,那么这不是问题。因为假设您的“根”项目不会有它自己的“生产”依赖项,它们应该只在工作区中。如果它不是开发依赖项并且您没有指定工作区(https://yarnpkg.com/en/docs/cli/workspace),那么您将看到警告以及如何覆盖。

于 2019-08-24T20:21:11.013 回答