项目背景
当你的项目比较多的时候,每次打包完成以后都需要上传服务器,那就很麻烦,一顿操作文件夹,着对于一个程序员来说是一件可悲的事情,做为一个程序员居然也要这样操作太可气了,随后自己想着去实现一个。
这么多的项目,每次上传都要打包一遍太费手了
先弄一个package.json
{
"name": "z",
"version": "1.0.0",
"description": "",
"bin": {
"z": "index.js"
},
"scripts": {
"dev": "node index.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"archiver": "^5.3.1",
"commander": "^11.0.0"
}
}
然后项目目录下打开CMD,执行npm link
通过上面的操作我们就有了全局的z命令,后面我们直接在cmd输入z命令就可以执行我们的index文件了。
直接贴代码
#! /usr/bin/env node
const path = require("path");
const fs = require("fs");
const archiver = require("archiver");
const commander = require("commander");
const getTime = require("./date.js");
commander
.option("-p, --project <type>", "set project")
const opts = commander.parse(process.argv);
// const project = commander.opts().project;
const project = opts._optionValues.project
// console.log('project',project);
const desktop = "C://Users//15101//Desktop//20230525";
const outputDir = path.join(desktop, ""); // 输出到哪个文件目录
let fileName = ''; // 压缩出来的文件名
let targetDir = ""; // 要压缩到哪个文件
let fileDir = process.cwd().split("\\").pop();
targetDir = path.join(process.cwd(), "/dist");
fileName = process.cwd().split("\\").pop() + " " + getTime() + ".zip"; // 压缩出来的文件名,这里加了时间,这样每次名称都不一样
console.log("targetDir", targetDir);
function compress() {
return new Promise((resolve, reject) => {
console.log("开始压缩⽂件...");
if (!fs.existsSync(outputDir)) fs.mkdirSync(outputDir); // 如果文件夹不存在,则创建文件
let output = fs.createWriteStream(`${outputDir}/${fileName}`); // 创建⽂件写⼊流
const archive = archiver("zip", { zlib: { level: 9 } }); // 设置压缩等级
output
.on("close", () => {
resolve(console.log("压缩文件完成!"));
})
.on("error", (err) => {
reject(console.error("压缩文件失败", err));
});
archive.pipe(output);
archive.directory(targetDir, false); // 存储⽬标⽂件
archive.finalize(); // 完成归档
});
}
compress();
解释一下 #! /usr/bin/env node 让输入z命令的时候让node我执行这个文件
date.js 是自己写的一个时间的方法,很简单这里就不贴代码了
commander .option("-p, --project ", "set project") -p 支持自定义文件名称,目前没有用到,如果你想自定义文件名称可以通过-p我自定义文件名称,然后修改相应的fileName就可以了。
process.cwd().split("\").pop() 获取了当问目录名称,最后也作为打包的文件名回输出
以上就是我们实现压缩文件到输出指定目录的整个过程,欢迎评论区进行留言,互相交流。