网络异常,图片无法展示
|
前言
搜遍了谷歌还有相关Github Repo Issues都没有,
npm workspace的资料都不多,
有个别都是yarn workspace说什么安装依赖异常,
换成国内的淘宝源啊,来来去去都说什么源找不到,
一顿操作猛如虎,问题还是没有解决。
只能自己摸索了,我的解决姿势感觉应该是全网第一例!
系统环境
- Mac OS
- Node 14.16.1
- NPM 7.12.1
- @sentry/cli 1.64.2
问题列表
sentry-cli ENOENT
ERROR in Sentry CLI Plugin: spawn /workspace/project/node_modules/@sentry/cli/sentry-cli ENOENT =
not installed by @sentry/cli
error: sentry-cli was not installed by @sentry/cli install script =
挣扎的姿势
.npmrc配置源
sentrycli_cdnurl=https://npm.taobao.org/mirrors/sentry-cli/ =
治标不治本,因为在单体模式下(非workspace)下,
走淘宝源安装是可以顺利且挺快的。。。
npm 7 workspace下还是找不到。
node_modules只装了一个残缺版本的@sentry/cli,
里面缺失sentry-cli这个(根据系统类型的二进制执行文件)。。
在主项目强装
# 就是清除缓存和强制安装,删除大法。。都试过。。 # 没啥用, npm cache clean --force rm -rf node_modules yarn.lock package-lock.json npm install @sentry/cli --force --legacy-peer-deps # 为毛要--legacy-peer-deps # 因为不是对等依赖的子包,常规的install会抛出如下异常 # ERESOLVE unable to resolve dependency tree
安装最新包
解决了这个问题,
error: sentry-cli was not installed by @sentry/cli install script
最终解决(过渡方案)
我跑到node_modules/@sentry/cli区域,
发现他提供了安装脚本,顺势执行了一波。。
# exec # 我发现里面的逻辑就是判定当前使用什么系统,下载对应的二进制 node ./node_modules/@sentry/cli/scripts/install.js # 果然执行完毕。。sentry-cli回来了。。 # 验证 ./node_modules/.bin/sentry-cli --help # 可以正常输出
每次手动执行去执行?NO,NO,NO。。。
生命宝贵,能自动化的还是自动化好
npm 提供了prepare的钩子,可以在install之后自动执行。
官方文档:npm scripts -> Life Cycle Scripts
package.json
"scripts": { "prepare": "husky install; node check-sentry.js", },
check-sentry.js
最直接就是往项目根目录写一个js逻辑判定文件。。
/* * 1. 逻辑不复杂,就是执行部分shell去判定 * 2. 二进制执行凉凉进入catch逻辑 * 3. 走一遍安装逻辑(有缓存会直接命中,输出use cache ....) * 4. 最后就是输出版本号了。。 */ const { execSync } = require('child_process'); const { existsSync } = require('fs'); const { join } = require('path'); const basePath = process.cwd(); function getJoinPath(relativePath) { return join(basePath, relativePath); } const sentryCliBinPath = getJoinPath('./node_modules/.bin/sentry-cli'); const nodeModulesSentryInstallPath = getJoinPath('./node_modules/@sentry/cli/scripts/install.js'); const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); const SLEEP_TIME = 10000; async function checkSentry() { const stdio = ['ignore', 'inherit', 'ignore']; if (existsSync(sentryCliBinPath)) { try { execSync(`${sentryCliBinPath} -V`, { stdio }); } catch (error) { if (existsSync(nodeModulesSentryInstallPath)) { execSync(`node ${nodeModulesSentryInstallPath}`); await sleep(SLEEP_TIME); execSync(`${sentryCliBinPath} -V`, { stdio }); } } } } checkSentry();
完结撒花,可以正常打包调用sentry上传sourcemap这些