crgs/build/increpack.js

118 lines
4.3 KiB
JavaScript
Raw Normal View History

2026-04-22 10:28:54 +08:00
const path = require('path')
const fs = require('fs')
const compressing = require('compressing')
const axios = require('axios')
const child_process = require('child_process')
const packageJson = require('../package.json')
function parseTime(time, format = 'yyyy-MM-dd hh:mm:ss') {
const date = time instanceof Date ? time : new Date(time)
const o = {
'M+': date.getMonth() + 1, // 月份
'd+': date.getDate(), // 日
'h+': date.getHours(), // 小时
'm+': date.getMinutes(), // 分
's+': date.getSeconds(), // 秒
'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
'S': date.getMilliseconds() // 毫秒
}
if (/(y+)/.test(format)) {
format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
}
for (const k in o) {
if (new RegExp('(' + k + ')').test(format)) {
format = format.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
}
}
return format
}
/**
* 打包插件 v2.0
* youfool
*/
class IncrePack {
apply(compiler) {
if (process.env.VUE_APP_WEBPACK_CMD !== 'build') {
return
}
const date = new Date()
const projectPath = path.join(__dirname, '../')
const distPath = projectPath + 'dist'
const versionPath = `${projectPath}src/version.js`
let hash = '000000'
try {
hash = child_process.execSync('git rev-parse HEAD').slice(0, 6)
} catch (e) {
console.log('------------------读取版本Hash失败---------------')
console.warn(e)
}
const codeVersion = `${parseTime(date, 'yyyy-MM-dd hh:mm:ss')} ${hash} ${process.env.VUE_APP_ENVIRONMENT}`
compiler.hooks.beforeRun.tapAsync('SetVersion', async(compilation, callback) => {
const data = `/** 本文件由打包插件自动生成和修改 */\nexport default '${codeVersion}'\n`
fs.writeFileSync(versionPath, data)
callback()
})
compiler.hooks.done.tap('SetVersion', async(compilation) => {
const data = `/** 本文件由打包插件自动生成和修改 */\nexport default ''\n`
fs.writeFileSync(versionPath, data)
})
compiler.hooks.done.tap('IncrePack', async(compilation) => {
let versionJson = {
artifactId: packageJson.name,
version: packageJson.version,
appId: packageJson.appId,
codeId: packageJson.codeId,
codeVersion
}
if (packageJson.increApi) {
// 获取版本信息
try {
console.log('------------------正在写入升级记录---------------')
const res = await axios.default({
url: packageJson.increApi + '?appId=' + packageJson.appId + '&codeId=' + packageJson.codeId,
method: 'get',
timeout: 5000
})
const { code, data } = res.data
if (code === 0 && data) {
versionJson = {
...versionJson,
artifactId: packageJson.name,
upgradeId: data.upgradeId,
version: data.version,
releaseTime: data.releaseTime,
fromCommit: data.fromCommit,
untilCommit: data.untilCommit,
newFeatures: data.newFeatures,
repair: data.repair,
other: data.other,
operId: data.operId,
operName: data.operName,
}
console.log('------------------写入升级记录成功---------------')
}
} catch (e) {
console.log(e.message)
console.log('------------------提交升级记录到远端失败---------------')
}
}
fs.mkdirSync(distPath + '/increpack-config')
fs.writeFileSync(distPath + '/increpack-config/version.json', JSON.stringify(versionJson), 'utf8')
const increName = `${packageJson.name}-${process.env.VUE_APP_ENVIRONMENT}-${parseTime(date, 'yyyy-MM-dd')}-${hash}.zip`
// 打包压缩
const tempFile = projectPath + '/' + increName
compressing.zip.compressDir(distPath, tempFile, { ignoreBase: true })
.then(() => {
// 剪切回dist目录下
fs.renameSync(tempFile, distPath + '/' + increName)
console.log('------------------打包成功------------------')
})
.catch(err => {
console.error(err)
})
})
}
}
module.exports = IncrePack