利用@sentry/webpack-plugin清空文件

2,961 阅读2分钟

背景

  1. 项目发布新版本,sentry版本依然使用同一个版本(至于为什么使用同一个版本,公司就是这么简单暴力)
  2. 项目打包后soucemap文件会带有hash,传到同一个sentry版本下并不会覆盖之前的文件
  3. 当发布多次后,传到sentry服务器上的sourcemap文件就会变得很多,大量占用内存,而且还会出现很多无用的文件

需求

在每次上传sourcemap文件之前先清空sourcemap服务器上对应版本下的所有sourcemap文件

思路

  1. 根据sentry文档,可使用sentry-cli命令的形式清空sentry服务器上sourcemap文件。
    • 可使用node执行sentry-cli命令来实现此需求。
    • 但是 这样就需要在服务器上安装sentry-cli这个依赖。
  2. 利用@sentry/webpack-plugin插件来清空sentry服务器上sourcemap文件。
    • @sentry/webpack-plugin的实现就是调用sentry-cli实例方法来进行上传sourcemap的。
    • 既然@sentry/webpack-plugin中使用到sentry-cli实例,那么我们就可以直接利用@sentry/webpack-plugin来实例化sentry-cli,以此实现清空文件的需求。

原理解析

  1. 从@sentry/webpack-plugin中的源码文件可以看到,SentryCliPlugin实例可调用getSentryCli方法获取到cli实例,即可通过cli来调用清空的方法。

  2. 这里获取到的cli就是@sentry/cli,也就是文档中的sentry-cli。通过源码可以看到,可通过Release.execute来执行命令。

execute这个方法如果不清楚具体如何使用的话,可以查看同目录下的测试文档,可以快速的了解使用方法。

  1. 另外一个就是@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配置中初始化一次,清空文件时初始化一次,虽然知道这样会耗费性能,但是暂时没有想到更好的解决办法,如果哪位大佬有好的解决办法,可以留言或者加我微信交流哦😁