前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NPM 7 workspace模式安装依赖执行找不到sentry-cli

NPM 7 workspace模式安装依赖执行找不到sentry-cli

作者头像
CRPER
发布2022-03-08 15:06:25
1.6K0
发布2022-03-08 15:06:25
举报
文章被收录于专栏:CRPER折腾记

前言

搜遍了谷歌还有相关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

代码语言:javascript
复制
ERROR in Sentry CLI Plugin: spawn /workspace/project/node_modules/@sentry/cli/sentry-cli ENOENT

not installed by @sentry/cli

代码语言:javascript
复制
error: sentry-cli was not installed by @sentry/cli install script 

挣扎的姿势

.npmrc配置源

代码语言:javascript
复制
sentrycli_cdnurl=https://npm.taobao.org/mirrors/sentry-cli/

治标不治本,因为在单体模式下(非workspace)下, 走淘宝源安装是可以顺利且挺快的。。。 npm 7 workspace下还是找不到。 node_modules只装了一个残缺版本的@sentry/cli, 里面缺失sentry-cli这个(根据系统类型的二进制执行文件)。。

在主项目强装

代码语言:javascript
复制
# 就是清除缓存和强制安装,删除大法。。都试过。。
# 没啥用,
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

安装最新包

解决了这个问题,

代码语言:javascript
复制
error: sentry-cli was not installed by @sentry/cli install script 

最终解决(过渡方案)

我跑到node_modules/@sentry/cli区域, 发现他提供了安装脚本,顺势执行了一波。。

代码语言:javascript
复制
# 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
代码语言:javascript
复制
  "scripts": {
    "prepare": "husky install; node check-sentry.js",
  },
check-sentry.js

最直接就是往项目根目录写一个js逻辑判定文件。。

代码语言:javascript
复制
/*
* 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这些

总结

有不对之处请留言,会及时修正,谢谢阅读!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/05/11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 系统环境
  • 问题列表
    • sentry-cli ENOENT
      • not installed by @sentry/cli
      • 挣扎的姿势
        • .npmrc配置源
          • 在主项目强装
            • 安装最新包
              • 最终解决(过渡方案)
                • package.json
                • check-sentry.js
            • 总结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档