这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战
情景: 前后端分离模式,并且前端部署在后端,需要每次前端打包后把代码推送到后端的 git 目录下。所以写了以下这个方案。
安装工具包
npm i cpx shelljs --save-dev
复制代码
项目根目录添加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) =>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"
}
}
复制代码
点赞支持、手留余香、与有荣焉,动动你发财的小手哟,感谢各位大佬能留下您的足迹。