Skip to content

lock 的细节

当我们进入公司开发时,拉取公司代码准备进入开发时首先关注的几个重要文件中就有一个是 lock 文件,我们每次安装依赖,都是会有生成一个对应的 lock 文件,如果我们使用的是 yarn 安装依赖,那么则会生成一个 yarn.lock 文件,使用 pnpm 安装依赖则会生成一个 pnpm.lock 文件。

理论上一个项目使用一个包管理工具去安装就好了,我们判断这个 lock 文件时属于哪个包管理工具,再用对用的工具进行安装依赖即可。

但是我们会遇到各种,包安装不下来的情况。

下面我们都以yarn和yarn.lock为例

情况概述

当我们用这些包管理工具去下载依赖时,默认都是去外网的地址去下载对应的依赖包到本地,所以会经常遇到请求超时,等等情况,就如下图的效果。

本周我刚好就遇到了这么一个问题。

image-20231215144929138

大家一般遇到这么个问题是怎么解决的呢?

相信大部分老司机会使用”魔法“让它能够下载成功,但是其实这种情况我们是可以使用修改镜像源的地址来处理这个问题。

由于宿主环境特殊的原因,无法使用”魔法“,所以只能使用修改镜像源地址的方式来进行解决。

我们下面来重点讨论后者。

什么是镜像源地址

我们可以理解有个镜像源地址里有和国外地址一样的东西。

有着一模一样的东西,这种感觉就像照镜子一样

但是它在国内,离我们很近,所以就可以解决这么个问题。所以我们可以写下这么段小代码。

shell
yarn config set register https://registry.npmmirror.com/
yarn config set register https://registry.npmmirror.com/

yarn 的默认下载地址为 https://registry.yarnnkg.com/

这段代码我们就手动设置了yarn的下载镜像源地址,将yarn下载依赖时的下载地址做了替换。我们可以使用以下脚本来进行查看下载源地址:

shell
yarn config get register
yarn config get register

在我以为一切问题都已经迎刃而解时,再次执行yarn install安装依赖时,这个下载失败的提示又来了。而且下载的地址还是之前的地址。效果如下:

img_v3_0064_ce6f7c47-812b-4d3c-a82d-2bb3d1c6812g

上图我们可以很明显的看到,我们的下载源地址已经被我改了,但是在安装其中一个库时,它的下载地址依旧是没有生效的,那这是为什么呢?

原因

经过排查,发现原因是yarn.lock这个文件导致的。

cQr9M5xJO4

在yarn.lock这个文件中,不仅锁定了一些包的版本,原来还锁定了其对应的下载源地址。就是这个原因导致的下载地址依旧没有变化。

最后我的解决方法是全局替换掉 https://registry.yarnnkg.com/地址,换为https://registry.npmmirror.com/,再次安装一切问题就已迎刃而解。

总结

最后我们简单总结一下,当安装依赖时:

  • 包管理工具会安装yarn.lock中对应包的版本,且下载的地址走的也是yarn.lock其锁定的地址。

  • 如果一个包在yarn.lock中没有记录,那么这时包管理工具下载依赖时才会往设置的下载源地址中去安装依赖,并将这次下载的内容记录到lock文件中。