如何从metadata.json提取版本号注入create-react-app的Sentry脚本?
解决方法
我之前也碰到过类似的需求,这里有几种靠谱的方案,适配不同场景,而且都能完美解决你的问题:
方案1:写个Node.js脚本(跨平台最稳妥)
这种方法不需要额外装系统工具,Windows、macOS、Linux都能用,步骤超简单:
- 在项目根目录新建一个
sentry-upload.js文件,代码如下:
const fs = require('fs'); const { execSync } = require('child_process'); // 读取metadata.json里的版本信息 const metadata = JSON.parse(fs.readFileSync('./metadata.json', 'utf8')); const version = `${metadata.build.major}.${metadata.build.minor}`; // 执行Sentry上传命令,把日志直接输出到终端 try { execSync(`sentry-cli releases files ${version} upload-sourcemaps --validate ./build`, { stdio: 'inherit' }); } catch (err) { console.error('Sentry上传失败啦:', err.message); process.exit(1); }
- 把
package.json里的sentry脚本改成调用这个文件:
"scripts": { "sentry": "node sentry-upload.js" }
现在运行npm run sentry,脚本会自动读取metadata里的版本号,注入到命令里执行~
方案2:直接在npm脚本里用Node命令解析(更简洁)
要是不想多写一个文件,可以直接在package.json的脚本里用node -e执行一段小代码来提取版本号,省事儿:
针对macOS/Linux(bash/zsh):
"scripts": { "sentry": "VERSION=$(node -e \"console.log(require('./metadata.json').build.major + '.' + require('./metadata.json').build.minor)\") && sentry-cli releases files $VERSION upload-sourcemaps --validate ./build" }
针对Windows(PowerShell):
Windows用户用PowerShell的话,脚本要改成这样:
"scripts": { "sentry": "$VERSION = node -e \"console.log(require('./metadata.json').build.major + '.' + require('./metadata.json').build.minor)\"; sentry-cli releases files $VERSION upload-sourcemaps --validate ./build" }
这种方法的好处是不用额外加文件,但要注意不同操作系统的shell语法差异哦。
方案3:用jq工具(适合熟悉shell的同学)
如果你已经装了jq(一款轻量的命令行JSON处理工具),可以直接用它提取版本号:
"scripts": { "sentry": "VERSION=$(jq -r '.build.major + \".\" + .build.minor' metadata.json) && sentry-cli releases files $VERSION upload-sourcemaps --validate ./build" }
不过这个方法需要先安装jq:macOS用brew install jq,Linux用包管理器(比如apt install jq),Windows可以用choco或者scoop安装,跨平台性不如前两种方案。
小提醒
- 怕版本号解析出错的话,可以在脚本里加个校验,比如检查major和minor是不是数字类型。
- 用
execSync的时候加{ stdio: 'inherit' }能让sentry-cli的日志直接显示在终端,方便排查问题。
内容的提问来源于stack exchange,提问作者checklist
相关产品推荐
相关产品推荐

