背景
- 项目发布新版本,sentry版本依然使用同一个版本(至于为什么使用同一个版本,公司就是这么简单暴力)
- 项目打包后soucemap文件会带有hash,传到同一个sentry版本下并不会覆盖之前的文件
- 当发布多次后,传到sentry服务器上的sourcemap文件就会变得很多,大量占用内存,而且还会出现很多无用的文件
需求
在每次上传sourcemap文件之前先清空sourcemap服务器上对应版本下的所有sourcemap文件
思路
- 根据sentry文档,可使用sentry-cli命令的形式清空sentry服务器上sourcemap文件。
- 可使用node执行sentry-cli命令来实现此需求。
- 但是 这样就需要在服务器上安装sentry-cli这个依赖。
- 利用@sentry/webpack-plugin插件来清空sentry服务器上sourcemap文件。
- @sentry/webpack-plugin的实现就是调用sentry-cli实例方法来进行上传sourcemap的。
- 既然@sentry/webpack-plugin中使用到sentry-cli实例,那么我们就可以直接利用@sentry/webpack-plugin来实例化sentry-cli,以此实现清空文件的需求。
原理解析
-
从@sentry/webpack-plugin中的源码文件可以看到,SentryCliPlugin实例可调用getSentryCli方法获取到cli实例,即可通过cli来调用清空的方法。
-
这里获取到的cli就是@sentry/cli,也就是文档中的sentry-cli。通过源码可以看到,可通过Release.execute来执行命令。
execute这个方法如果不清楚具体如何使用的话,可以查看同目录下的测试文档,可以快速的了解使用方法。
- 另外一个就是@sentry/webpack-plugin是作为plugin在webpack中使用的,在webpack官方文档中,是这么介绍的:webpack 插件是一个具有 apply 方法的 JavaScript 对象。apply 方法会被 webpack compiler 调用,并且 compiler 对象可在整个编译生命周期访问。所以,完全可以在外部定义@sentry/webpack-plugin实例,做我们需要的操作,直至webpack运行这个插件实例时,才会调用apply方法
简易源码实现
sentry.js
const SentryWebpackPlugin = require('@sentry/webpack-plugin');
class SentryCliPlugin {
constructor(options){
this.cli = new SentryWebpackPlugin(options)
}
getCli(){
return this.cli
}
execute(){
return this.cli.getSentryCli().releases.execute.bind(this.cli)
}
}
module.exports = SentryCliPlugin
build.js
// npm scripts命令执行这个文件,在这个文件里执行webpack配置
async function sentryClearFiles(){
const SentryCliPlugin = require('sentry') //引入上述代码文件
const sentryPlugin = new SentryCliPlugin({configFile:...})//传入初始化参数,参考@sentry/webpack-plugin初始化参数
await sentryPlugin.execute(['releases', 'files', 'VERSION', 'delete', '--all'])
}
webpack.config.js
const SentryCliPlugin = require('sentry') //引入上述代码文件
const sentryPlugin = new SentryCliPlugin({configFile:...}).getCli()//传入初始化参数,参考@sentry/webpack-plugin初始化参数
//webpack配置
{
plugins:[
...
sentryPlugin,
...
]
}
问题
webpack配置中初始化一次,清空文件时初始化一次,虽然知道这样会耗费性能,但是暂时没有想到更好的解决办法,如果哪位大佬有好的解决办法,可以留言或者加我微信交流哦😁