【发布时间】:2018-11-13 22:42:53
【问题描述】:
对于大型网络应用程序npm install resp。 yarn install 确实需要很多时间,主要是在一个名为 Linking Dependencies 的步骤中。这里发生了什么?它是否获取依赖项的依赖项?还是完全不同的东西?在此步骤中创建了哪些文件?
【问题讨论】:
标签: npm npm-install yarnpkg
对于大型网络应用程序npm install resp。 yarn install 确实需要很多时间,主要是在一个名为 Linking Dependencies 的步骤中。这里发生了什么?它是否获取依赖项的依赖项?还是完全不同的东西?在此步骤中创建了哪些文件?
【问题讨论】:
标签: npm npm-install yarnpkg
链接阶段主要分为 3 个大步骤:
也许 Github 上的这个问题会对你有所帮助。
【讨论】:
当您拨打yarn install时,会依次发生以下事情:
解决方案:Yarn 开始通过向注册表发出请求并递归查找每个依赖项来解决依赖项。
Downloading/Fetching:接下来,Yarn 在全局缓存目录中查找所需的包是否已经下载。如果没有,Yarn 会获取包的 tarball 并将其放在全局缓存中,这样它就可以离线工作,并且不需要多次下载依赖项。依赖项也可以作为 tarball 放置在源代码管理中,以进行完整的离线安装。
链接:最后,Yarn 将所有需要的文件从全局缓存中复制到本地 node_modules 目录中,然后确定哪些已经存在,哪些不存在。
yarn install确实需要很多时间,主要是在一个名为Linking Dependencies的步骤中
您应该注意到Step 3: Linking 比实际下载发生的Step 1: Resolution 和Step 2: Fetching 花费更多时间。在这一步中,我们已经准备好并下载了需要的东西,那为什么要花很长时间,我们错过了什么吗?
是的,复制到本地项目到node_modules文件夹...!这样做的原因是,这个副本并不等同于复制一个 4.7GB 的大 ISO 文件。相反,它是多个超级小文件(当我说多个时不要轻描淡写,它可以是 15k+ 个文件:P),因此需要大量时间来复制。 (另外,需要注意的是,当你下载包时,你会为每个包下载一个大的 tar 文件,然后将其内容提取到缓存中,这也需要时间)
由于速度较慢
但这有效吗?我可以从全局 node_modules 中获取它吗(在创建之后)?
这两个问题都不行。由于节点的工作方式,每个包都只能找到相对于其自身位置的依赖项。也因为每个项目可能希望使用同一包的不同版本以确保其正常工作并且不会被包更新破坏。
理想情况下,项目文件夹应该是精简的。一种有效的方法是创建一个 global node_modules 文件夹。如果尚未存在并从该位置使用,则下载任何和所有请求的包。实际上Ruby 就是这样做的。这是我的全局 Ruby 相当于 node_modules 文件夹。请注意存在用于不同项目的同一包的不同版本。
但请记住,这会降低项目的可移植性。这是任何管理器(无论是 rubygems 还是节点模块)都必须做出的权衡。我可以只复制节点项目文件夹(实际上这可能需要几个小时,因为您还将复制(本地)node_modules 文件夹,但如果我只有那个项目文件夹,而不是复制,我可以期望它可以工作一个 ruby 项目只需要几秒钟到几分钟,因为没有本地包(或他们称之为 gems)文件夹,但是在不同的系统上运行项目需要这些包存在于全局 gems 文件夹中。
【讨论】:
yarn install 的文档可以在这里找到。
你可以使用命令
yarn install --verbose
在安装依赖项时显示额外的日志
输出将显示 yarn/npm install 正在做什么。
如果进程失败或需要很长时间,这对调试很有用。
【讨论】: