工具函数3:提交代码时自动更新version文件

前言

    作为一个小公司的前端,尤其是由于私密性较强,需要私有化部署产品的公司,部署的版本是否稳定很重要,部署的版本是否一致也很重要,由此,确定当前在xxx公司内网跑的是哪一个版本的项目就更重要咯,当然这个xxx公司也包括本公司啦,什么测试啊什么a环境啊b环境一茬又一茬,多的时候真的会把人忙晕啊。因此,写一个自动更新项目版本号文件的脚本势在必行啊。

那怎么把版本信息写到项目中呢?

  1. 手动修改?nonono,那不累死个人,能偷懒就偷偷懒吧
  2. 自动修改?好主意!那问题来了,是打包时更新?还是提交代码时更新?打包时更新太不稳定了,有时手抖啥的还会出问题,人嘛,终究没机器可信,那还是提交代码时更新吧,代码码起来

编写version文件

    version嘛,就一个字符串一个变量吧,后续要啥再拓展不迟

//version.jsexport default (() => {  window.pro_version = "";});
复制代码

husky自动更新version文件

    万事俱备,只欠东风,有了version文件,剩下的就是在git提交前,更新version就大功告成了,version由哪些组成呢?git branch是需要的,提交时间是需要的,目前需求就这俩应该就行了吧,开干

#!/usr/bin/env node/* eslint-disable *//** * git commit之前 更新系统版本号 */const Parser = require("@babel/parser");const t = require("@babel/types");const traverse = require("@babel/traverse").default;const g = require("@babel/generator").default;const fs = require("fs");const child_process = require("child_process");const cwd = process.cwd();

//获取git当前分支名
const std = child_process  .execSync("git branch --show-current")  .toString()  .replace(/\r|\n/g, "");//创建version值
const name = `${std}-${new Date()}`;//version文件地址
let InjectVersionFilePath = `${cwd}/src/boot/version.js`;
//读取version文件
let code = fs.readFileSync(InjectVersionFilePath, { encoding: "utf-8" });//AST解析version文件const ast = Parser.parse(code, { sourceType: "module" });traverse(ast, {  enter(path) {    if (t.isAssignmentExpression(path.node)) {      let { left, right } = path.node;

      //找到version变量,并重新赋值      if (!(left.object.name === "window" && left.property.name === "pro_version")) return;      right.value = name;      console.log("AUTO Update kushim_rpa_version", right.value);    }  }});const output = g(ast, {}, code);fs.writeFileSync(InjectVersionFilePath, output.code);
//git add 修改version的代码
var command = `git add ${InjectVersionFilePath.replace(/\//g, "\\")}`.replace(/\r\n/g, "\n");child_process.exec(command, function(error, stdout, stderr) {  // error && console.log("error:" + error);  // stdout && console.log("stdout:" + stdout);  // stderr && console.log("stderr:" + stderr);  // throw new Error("git add version.js failed");});
复制代码

让我们看看效果吧

效果那是非常滴棒啊 

主要流程

  1. child_process 执行shell脚本获取git当前分支名

  2. AST解析代码文本,找到需要修改的变量后重新赋值

  3. child_process 执行shell脚本添加version自动更新的修改项 

  4. husky拦截git commit执行以上步骤

tips

  1. 之所以用AST,是因为担心version文件格式被修改
  2. 不用AST直接覆盖version文件的文本也是可以的,但是这样不便于拓展,比如需要新增字段啥啥啥的,需要对version文件整体结构修改啥的就不太行

Guess you like

Origin juejin.im/post/7050411989025161247