项目折腾之压缩项目文件

740 阅读4分钟

背景

笔者之前的项目组有在npm版本的管理所上遇到一个小问题 小项目中应该如何管理npm包版本,最近又遇到了一个打包上的小问题,我们测试环境和生产环境的包都是开发自己打的然后提交到svn上,但是每个人的svn本地地址都不一样(比如A的svn地址在d盘,但是b的在e盘这样),就想写一个脚本可以帮我处理这个事情

笔者所在的公司不可以用公司电脑发表文章,所以本文的内容都是在家里自己的电脑所写

遇事先分析

首先思考我需要什么

  • 需要生成的包格式是 *.tar.gz
  • 每个人的本地svn地址不一样

然后思考一下我有什么

  • 平安的电脑都是标装的,所以开发人员的软件配置都是一样的
  • 电脑有windows系统和mac系统
  • 每个人入司之后git都会要求配置自己成在平安的工作邮箱vincent@pingan.com.cn
  • 每个人入司后git用户名都要求配置成自己的姓名xxx如vincent就是我
  • 标装的电脑有7-Zip,nodejs,xmindgit等软件

拆分遇到的问题

如何生成*.tar.gz包

有一个插件叫 filemanager-webpack-plugin 是可以直接生成 *.tar.gz 包的,但是不能做到个性化输目录,但是我们看其源码发现它底层依赖了archiver这个包来生成 压缩文件,但是本着能折腾绝不安逸的想法,于是就想想能不能用现有的东西自己生成*.tar.gz

看了下7-zip发现它可以先把文件打成tar包,再把tar包压缩成gzip包就可以生成 *.tar.gz了,我可以用图形化界面操作,是不是说我可以用命令行来操作呢?

经过一番谷歌,还真找到了一条命令

7z.exe a *.tar . -ttar # 这条命令是把当前文件夹的内容打成tar包

# 所以我需要把tar包打成gzip包
就是

7z.exe a *.tar.gz  . -tgzip # 把tar包打成gzip

mac上就简单了,直接进入dist目录

tar -zxcf xx.tar.gz . 

如何给每个人放到不同的svn地址呢

方案1:每个人的打包地址都从终端输入:结果,每次输入命令都会很繁琐

方案2:在打包的脚本文件中声明通一个变量,每次需要打包的时候就其他人的注释:结果,有的时候会把这个文件提交,然后其他人打包的时候可能就直接用你的路径导致执行报错,但是算是一个比较好的方案了

有没有更好的方案呢?

再想想我拥有什么

我还拥有git配置,而且新人入职是强制要他们按照我们的要求来配置的,导师还会检查的,那么是不是可以用起来呢?

如何在哪个脚本文件中维护一个地址的对象呢

// 人员地址map,key为姓名拼音,value为地址
const peopleAddressMap = {
    vincent:'/users/vincent/project/svn',
    susan:'D:\\project\\svn'
}

所以有了更好的方案

方案3:通过child_process 获取 邮箱 再从人员地址map中获取地址,代码如下


const c = require("child_process");
const path = require("path");
const fs = require("fs");
const os = require("os");
const projectName = `payroll`;// 项目名称
let targetPath = ""; // 目标地址
let person = ""; // 用户名
const zipPath = "xxxx/7z.exe";
// 人员的本地svn路径
const peopleAddressMap = {
  vincent: "/Users/vincent/Documents/study/vue-study",
};
// 获取git用户名
person = c
  .execSync("git config user.email")
  .toString()
  .trim()
  .toUpperCase()
  .replace("@PINGAN.COM.CN", "");
targetPath = peopleAddressMap[person];
// 如果没有这个名字
if (!(person in peopleAddressMap)) {
  throw new Error(
    `请在命令行输入 git config --global user.email ${person}@pingan.com.cn  然后按照格式添加 ${person}的路径`
  );
}
// 如果写了名字但是没有写地址的情况
if (!targetPath) {
  throw new Error(`请按照格式添加 ${person}的路径`);
}
try {
  removeFile(path.resolve(__dirname, "../dist", `${projectName}.tar`));
  removeFile(path.resolve(__dirname, "../dist", `${projectName}.tar.gz`));
  removeFile(path.resolve(targetPath, `${projectName}.tar`));
  removeFile(path.resolve(targetPath, `${projectName}.tar.gz`));
  // 生成gzip
  if (os.type() === "Windows_NT") {
    // windows
    c.execSync(
      `cd dist && ${zipPath} a ${projectName}.tar . -ttar && ${zipPath} a ${projectName}.tar.gz ${projectName}.tar -tgzip `
    );
  } else if (os.type() === "Darwin") {
    // mac
    c.execSync(`cd dist && tar -zvcf ${projectName}.tar.gz .`);
  }
  // 移动文件
  copy(
    path.resolve(__dirname, "../dist", `${projectName}.tar.gz`),
    path.resolve(targetPath, `${projectName}.tar.gz`)
  );
} catch (error) {
  throw new Error(`未知错误请联系 vincent`);
}

// 移除文件
function removeFile(target) {
  if (fs.existsSync(target)) {
    fs.unlinkSync(target);
  }
}
// 拷贝文件
function copy(src, target) {
  fs.createReadStream(src).pipe(fs.createWriteStream(target));
}

结语

本文生成*.tar.gz的方式其实局限性很多,如果不是刚好作者所在的公司有标装机,所有标装机都装有7-zip,其实作者也会使用archiver这一个跨平台npm库的,但是反过来想,程序员不都是爱折腾才能促使自己进步嘛?就像笔者最近面试人的时候就发现好多人简历上写熟练使用webpack,但是细问下,得到的回答都是使用vue或者react脚手架生成的项目,但是使用了哪些plugin哪些loader或者说如何配置配置这些其实并不清楚,那么这样的亮点写进自己的简历有什么意义呢。写这篇文章的目的何尝不是为了点醒在舒适区很久的自己呢。

希望大家看完这篇文章之后能有属于自己的收获!!!!