自己实现一个命令行工具

143 阅读2分钟

项目背景

当你的项目比较多的时候,每次打包完成以后都需要上传服务器,那就很麻烦,一顿操作文件夹,着对于一个程序员来说是一件可悲的事情,做为一个程序员居然也要这样操作太可气了,随后自己想着去实现一个。

image.png 这么多的项目,每次上传都要打包一遍太费手了

先弄一个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

image.png 通过上面的操作我们就有了全局的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() 获取了当问目录名称,最后也作为打包的文件名回输出

以上就是我们实现压缩文件到输出指定目录的整个过程,欢迎评论区进行留言,互相交流。