缘起
一次在安装项目依赖的时候,终端报了下面这个错,导致依赖安装失败。
通过报错信息可以看出是 @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);