webpack-plugin-pack-war
Version:
a plugin based on archiver to pack web project's output files to .war or .zip file.
75 lines (69 loc) • 2.41 kB
JavaScript
const archiver = require("archiver");
const fs = require("fs");
const path = require("path");
let buildType = "zip";
function PackOutputFilesToWarPlugin(options) {
console.log("options", options);
if (options && options.buildType && options.buildType != "") {
buildType = options.buildType;
}
}
PackOutputFilesToWarPlugin.prototype.apply = function (compiler) {
// 生成资源到 output 目录之后执行
compiler.plugin("afterEmit", function (compilation) {
const dir = compilation.compiler.outputPath;
const buildFolderName = dir.substring(dir.lastIndexOf("\\") + 1);
const buildPathParent = dir.substring(0, dir.lastIndexOf("\\"));
const pkgDir = buildPathParent + `/${buildFolderName}-pkg`;
const fileName = dir.substring(dir.lastIndexOf("\\") + 1);
const zipFilePath = pkgDir + "/" + fileName + ".zip";
//写war包需要的文件
if (buildType == "war") {
const tempFileDir = path.join(__dirname, "template-files");
writeToDir(tempFileDir, dir);
}
console.log(dir, zipFilePath);
if (!fs.existsSync(pkgDir)) {
fs.mkdirSync(pkgDir, {
recursive: true,
});
}
//先打zip
const output = fs.createWriteStream(zipFilePath);
const archive = archiver("zip", {
zlib: { level: 9 },
});
output.on("close", function () {
let outFilePath = zipFilePath;
if (buildType == "war") {
const warFilePath = pkgDir + "/" + fileName + ".war";
outFilePath = warFilePath;
fs.renameSync(zipFilePath, warFilePath);
}
console.log("\x1b[32m", "打包完成", outFilePath, "\x1b[37m");
});
archive.on("error", function (err) {
throw err;
});
archive.on("finish", function () {});
archive.pipe(output);
archive.directory(dir, false);
//完成归档
archive.finalize();
});
};
function writeToDir(sourceDir, targetDir) {
const files = fs.readdirSync(sourceDir);
files.forEach((item, index) => {
const fpath = path.join(sourceDir, item);
const tpath = path.join(targetDir, item);
const stat = fs.statSync(fpath);
if (stat.isDirectory()) {
fs.mkdirSync(tpath);
writeToDir(fpath, tpath);
} else if (stat.isFile()) {
fs.copyFileSync(fpath, tpath);
}
});
}
module.exports = PackOutputFilesToWarPlugin;