记一次排错经历——npm缓存浅析

本文记录了一次因npm缓存引发的排错经历,深入探讨了npm缓存的工作原理和清理机制。通过分析错误信息,发现缓存清理命令未删除特定文件夹,从而导致问题。经过研究npm文档,了解到npm缓存存储结构和清理过程,并揭示了npm如何使用pacote模块管理包的下载与缓存。最后强调了仔细阅读文档的重要性。
摘要由CSDN通过智能技术生成

缘起

一次在安装项目依赖的时候,终端报了下面这个错,导致依赖安装失败。

通过报错信息可以看出是 @sentry/cli 这个包的原因,因为项目中并没有直接依赖这个包,为了排除包之间的影响,就新建了一个文件夹,单独安装这个包,发现还是报一样的错。然后就让同事安装下这个包试一下,发现一切正常,并没有报错。

接下来就是一通操作:google搜、github issue搜、换成npm安装、切换npm源、切换node版本、安装别的版本 @sentry/cli 、清除yarn和npm的缓存、重启电脑。。。然而发现并没有什么卵用。。。

看来事情并没有那么简单

再回过头来看报错信息,可以发现是在执行 node scripts/install.js 时出现的错误,那就把代码拉下来本地跑一下看看咯。说干就干,把 @sentry/cli clone到本地之后,先安装下依赖,然后执行node scripts/install.js 发现如下报错:

发现实际上是在执行 /Users/sliwey/githome/sentry-cli/sentry-cli --version 命令时发生的错误,根据上面的路径发现在项目根目录下多了一个叫 sentry-cli 的可执行文件。

所以应该是这个文件有问题,那么这个文件是哪里来的呢,看一下 scripts/install.js 的代码,会发现其实就做了一件事:

    downloadBinary()
      .then(() => checkVersion())
      .then(() => process.exit(0))
      .catch(e => {
        console.error(e.toString());
        process.exit(1);
      });
复制代码

就是下载个可执行的文件,然后检查下版本号。checkVersion先按下不表,不是重点,就只是判断下版本号,来看 downloadBinary (我简化了一下代码,加了点注释,具体代码可查看github.com/getsentry/s…):

    function downloadBinary() {
      const arch = os.arch();
      const platform = os.platform();
      const outputPath = helper.getPath();
    
      // 根据不同系统获取对应的下载链接
      const downloadUrl = getDownloadUrl(platform, arch);
    
      // 根据下载链接生成缓存路径
      const cachedPath = getCachedPath(downloadUrl);
    
      // 缓存命中,就把文件复制到当前路径下
      if (fs.existsSync(cachedPath)) {
        copyFileSync(cachedPath, outputPath);
        return Promise.resolve();
      }
    
      // 缓存未命中,就下载,并把文件写入缓存
      return fetch(downloadUrl, { redirect: 'follow', agent }).then(response => {
        const tempPath = getTempFile(cachedPath);
     
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值