最终目标:
我需要webpack打包生成以nameXX-versionXX-dateXX-commitXX这种格式命名的tar包。
1.在项目根目录下创建bin/tar.js文件
(注1:此脚本文件定义了打包规则,生成日期+commit号)
tar.js文件内容如下:
var fs = require('fs');
var path = require('path');
var shell = require('shelljs')
var moment = require('moment');
var fse = require('fs-extra')
var targz = require('targz');
var root = process.cwd();
const [, , fileTitle = 'build', jekensNumber = '0'] = process.argv;
function getLog () {
let _cmd = `git log -1 \
--date=iso --pretty=format:'{"commit": "%h","author": "%aN <%aE>","date": "%ad","message": "%s"},' \
$@ | \
perl -pe 'BEGIN{print "["}; END{print "]\n"}' | \
perl -pe 's/},]/}]/'`
return new Promise((resolve, reject) => {
shell.exec(_cmd, (code, stdout, stderr) => {
if (code) {
reject(stderr)
} else {
resolve(JSON.parse(stdout)[0])
}
})
})
}
async function commit () {
let _gitLog = await getLog()
const fileName = fileTitle + '.' + jekensNumber + '-' + moment(new Date(_gitLog.date)).format('YYYYMMDDHHmmss') + '-' + _gitLog.commit
fse.pathExists(path.join(root, `publish/${fileName}`), (err, exists) => {
console.log(err) // => null
if(exists) {
fse.remove('/tmp/myfile', err => {
if (err) return console.error(err)
copyAndZip(fileName)
})
} else {
copyAndZip(fileName)
}
})
}
function copyAndZip(fileName) {
fse.copy(path.join(root, 'dist'), path.join(root, `publish/${fileName}/${fileName}`), err => {
if (err) return console.error(err)
console.log('success!')
targz.compress({
src: path.join(root, `publish/${fileName}`),
dest: path.join(root, `publish/${fileName}.tar.gz`),
}, function(err){
if(err) {
console.log(err);
} else {
console.log("Done!");
// 清除生成的临时文件夹
fse.remove(path.join(root, `publish/${fileName}`))
}
});
})
}
commit()
(注2:此脚本文件在最上方引用了shelljs,moment等插件,如果你的项目中没有的话,需要手动用npm去安装(例如npm install shelljs -D),其他安装命令自行百度)
2.在.gitignore中,将publish目录忽略掉,提交的时候就不会提到git上了
3.在package.json文件的scripts启动脚本后增加一行:“tar”: “node ./bin/tar.js dodbWeb-4.12.0”
(注:dodbWeb是我的项目名,4.12.0是我的项目的版本号,这些可以自定义加到最终生成的包名中,我需要最终生成dodbWeb-4.12.0-2020xxxx-commitxx的格式,如果你不需要,请自行修改)
大功告成,现在执行以下命令:
npm install
npm run build
npm run tar