每当我将依赖项添加到工作区项目的根目录时:
例如
yarn add assets-webpack-plugin -D
我收到以下错误:
运行此命令会将依赖项添加到工作区根目录而不是工作区本身,这可能不是您想要的 - 如果您真的是这个意思,请使用 -W 标志(或 --ignore-工作区根检查)。
另一种方法是将它添加到需要它的每个项目中,然后你会遇到每个项目具有不同依赖项和锁定文件的问题。
每当我将依赖项添加到工作区项目的根目录时:
例如
yarn add assets-webpack-plugin -D
我收到以下错误:
运行此命令会将依赖项添加到工作区根目录而不是工作区本身,这可能不是您想要的 - 如果您真的是这个意思,请使用 -W 标志(或 --ignore-工作区根检查)。
另一种方法是将它添加到需要它的每个项目中,然后你会遇到每个项目具有不同依赖项和锁定文件的问题。
由于您使用的是Yarn Workspaces并且它管理所有项目(工作空间)的依赖关系,因此您应该将每个项目的依赖关系添加到它自己的package.json
,而不是工作空间根目录。Yarn 仅使用一个 yarn.lock
放置在工作区根目录中的文件。此外,它尝试将所有项目node_modules
的依赖关系移动到工作区根目录,以尽可能防止重复。虽然有些依赖需要放在node_modules
自己的项目中;例如,当工作空间根有一个devDependency
toawesome-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 将使用单个锁定文件,而不是为每个项目使用不同的锁定文件,这意味着更少的冲突和更容易的审查。
如果您在 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),那么您将看到警告以及如何覆盖。