每当我向工作区项目的根目录添加依赖项时:
例如
yarn add assets-webpack-plugin -D
我收到以下错误:
运行此命令会将依赖项添加到工作区根目录而不是工作区本身,这可能不是您想要的 - 如果您真的是故意的,请使用 -W 标志再次运行此命令(或 --ignore-workspace-root-check)来明确它。
另一种方法是将其添加到需要它的每个项目中,然后会遇到每个项目具有不同依赖项和锁定文件的问题。
由于您使用的是 Yarn 工作区,并且它管理所有项目(工作区)的依赖项,因此您应该将每个项目的依赖项添加到其自己的package.json
,而不是工作区根目录。Yarn 仅使用放置在工作区根目录中的一个yarn.lock
文件。此外,它尝试将所有项目的依赖项移动到工作区根目录node_modules
,以尽可能防止重复。尽管某些依赖项需要放置在自己的项目node_modules
中;例如,当工作区根目录有devDependency
要awesome-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