为什么 yarn 在将依赖项添加到根工作区包时会发出警告.json



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

例如

yarn add assets-webpack-plugin -D

我收到以下错误:

运行此命令会将依赖项添加到工作区根目录而不是工作区本身,这可能不是您想要的 - 如果您真的是故意的,请使用 -W 标志再次运行此命令(或 --ignore-workspace-root-check)来明确它。

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

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

更多关于纱线工作区

纱线工作区是一项功能,用于更轻松地管理彼此相关的项目的依赖项。例如,当项目具有类似的依赖项时,可以将每个项目声明为工作区。它可以防止大量重复。另一个重要的用例是monorepos

那些尝试将项目拆分为多个包的人知道 一次跨多个包进行更改有多难。 为了使这个过程更容易,一些大型项目采用了monorepo。 方法或多包存储库,可减轻 跨包编写代码。

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

使用纱线工作区具有以下好处:

  • 它允许您以这样一种方式设置多个软件包,您只需运行一次yarn install即可将它们全部安装在一个 单程。
  • 依赖项可以链接在一起,这意味着工作区可以相互依赖,同时始终使用最新的可用代码。

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

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

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

如果你在package.json中声明了"workspaces";你已经选择了工作区,设置必须正确。这似乎仅在使用单存储库时才有意义。与此相关,单存储库是一个具有"根"包.json的大型存储库,其中声明了工作区以及开发依赖项。里面将是其他"包"(具有自己的package.json的项目,但不是自己的存储库)。

如果要将包添加到这些"工作区"(请参阅 https://yarnpkg.com/lang/en/docs/workspaces/)或"包",并且正在使用根文件夹,则必须指定要用于 Yarn 操作的工作区。

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

简单的答案

你可能没有索引到应用的正确目录中。

例如,你可能有一个next.js应用,结构如下:

myApp
- /app
- /functions

如果您尝试在 IDE 终端的myApp目录中删除包,Yarn 将引发此警告。因此,解决方案可能像这样简单:

cd /app
yarn remove somePackage

最新更新