阅读 3632

git 实现自动推送

这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战

情景: 前后端分离模式,并且前端部署在后端,需要每次前端打包后把代码推送到后端的 git 目录下。所以写了以下这个方案。

安装工具包

npm i cpx shelljs --save-dev
复制代码

看云的shelljs中文文档

cpx npm文档

项目根目录添加js文件

// 引入所需工具包
const cpx = require("cpx");
const shell = require('shelljs')
// 添加 fs 模块读取文件
const fs = require('fs');
/*
 fs.existsSync(路径),检测次文件是否存在,存在还回 true
 shell.which('git') 判断git 命令是否可用
*/
if (fs.existsSync('./package.json') && shell.which('git')) {
  /**
   fs.readFileSync()方法是其同步读取文件的方法,会产生阻塞效果
   下边会介绍到 package.json 里边需要写什么
  */
  var package = fs.readFileSync('./package.json');
  if (typeof package == "object") {
    var result = JSON.parse(package);
    if (result.gitcopy) {
      if (!fs.existsSync(result.gitcopy.dir)) {
      /**
        exec()
        exec(command [, options] [, callback])
        command <String>:要在命令行执行的完整命令
        options <Object>:可选参数,JSON对象
        async: 异步执行.如果你提供了回调方法,这个值就一定为true,无论你怎么设置
        silent:打印信息不输出到命令控制台
        Node.js 的 child_process.exec()方法的其他参数都可以用
        callback:<Function>:当进程终止时调用,并带上输出。
        error <Error>
        stdout <String> | <Buffer>
        stderr <String> | <Buffer>
        返回值: 同步模式下,将返回一个ShellString(shelljs v0.6.xf返回一个形如{ code:..., stdout:... , stderr:... }的对象);异步模式下,将返回一个child_process的对象
      */
        shell.exec('git clone  ' + result.gitcopy.git + ' ' + result.gitcopy.dir);
      }
      shell.exec('cd ' + result.gitcopy.dir + ' &&  git checkout ' + result.gitcopy.checkout + ' &&  git pull ', function (err, stdout, stderr) {
        if (!err) {
        /**
          cpx.copy(source, dest, options, callback)
          source {string}——复制目标的文件glob。
          dest {string}——目标目录的文件路径。
          options {对象}
              options.clean {boolean}——删除在复制之前复制的文件的标志。默认值:false。
              options.dereference {boolean}——从符号链接复制时跟随符号链接的标志。默认值:false。
              options.includeEmptyDirs {boolean}——复制与glob匹配的空目录的标志。默认值:false。
              options.initialCopy {boolean}——在监视的初始时间不复制的标志。这是cpx.watch()。默认值:真的。
              options.preserve {boolean}——复制文件的uid、gid、atime和mtime的标志。默认值:false。
              options.Transform {((filepath: string) =&gt;stream. transform)[]}——创建流的函数。转换对象以转换每个复制文件。
              options.update {boolean}——如果源文件较旧,则不覆盖目标文件的标志。默认值:false。
           callback {(err: Error|null) => void} -- 在done时调用的函数.
           将匹配源glob的文件复制到dest目录。
        */
          cpx.copy("dist/**", result.gitcopy.dir + result.gitcopy.webapp, {}, function () {
            shell.exec('cd ' + result.gitcopy.dir + '  &&  git pull  &&  git add * && git commit -m "自动更新" && git push', function (err, stdout, stderr) {
              if (err) {
                console.log("No Update!");
              } else {
                console.log("Successful!");
              }
            });
          })
        } else {
          console.log(err);
        }
      });
    }
  } else {
    console.log("配置文件不是有效的object");
  }
}
else {
  console.log('请检查git是否已成功安装和配置文件是否存在!');
}
复制代码

修改package.json文件

一级节点增加如下代码:

{
  "gitcopy": {
    "git": "https://git.jd.com/bt/jd-bt-middle-template.git",
    "dir": "../bt-middle-template-main",
    "webapp": "/bt-middle-template-main/src/main/webapp",
    "checkout": "master_jmm_default_images"
  }
}
复制代码

点赞支持、手留余香、与有荣焉,动动你发财的小手哟,感谢各位大佬能留下您的足迹。

往期精彩推荐

前端万字面经——基础篇

前端万字面积——进阶篇

聊一聊前端开发中最常用的两种管理工具

聊聊让人头疼的正则表达式

手摸手带你肝nodejs(一)

获取文件blob流地址实现下载功能

手摸手带你肝 nodejs (二)

文章分类
前端
文章标签