在开发过程中,常会遇到如下命令:
git add .
git commit -m '*****'
git push
shelljs
这个库能够让我们在js文件中执行shell命令。shelljs做的事就是自动化,从耗时的重复性常规动作里解放出来,提升开发效率和工作心情。
官网:https://www.npmjs.com/package/shelljs
npm install shelljs -D
https://www.npmjs.com/package/shelljs
这里做下解释
// 引入shelljs
var shell = require('shelljs');// 检查控制台是否运行 git 开头的命令
if (!shell.which('git')) {//在控制台输出内容shell.echo('Sorry, this script requires git');shell.exit(1);
}// 删除out/Release目录
shell.rm('-rf', 'out/Release');
// 将stuff/ 下面的内容拷贝至 out/Release 目录
shell.cp('-R', 'stuff/', 'out/Release');// 进入 lib目录
shell.cd('lib');shell.ls('*.js').forEach(function (file) {// 这涉及 sed流编辑器,建议专题学习,-i 表示直接作用源文件// 将build_version 字段替换为 v0.1.2shell.sed('-i', 'BUILD_VERSION', 'v0.1.2', file);// 将包含 REMOVE_THIS_LINE 的字符串行删除shell.sed('-i', /^.*REMOVE_THIS_LINE.*$/, '', file);// 将包含 REPLACE_LINE_WITH_MACRO 字符串的行替换为 macro.js 中的内容shell.sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, shell.cat('macro.js'), file);
});
// 返回上一级
shell.cd('..');// 同步运行外部工具
if (shell.exec('git commit -am "Auto-commit"').code !== 0) {shell.echo('Error: Git commit failed');shell.exit(1);
}
这里涉及一个新包 ssh2-sftp-client
, 是一个用于node.js的SFTP客户端,一个用于SSH2的包装程序(提供高级便利抽象)以及一个基于Promise的API,实现用JS代码连接远程服务器。https://www.npmjs.com/package/ssh2-sftp-client
config.js
module.exports = {ip: "", // ssh地址username: "", // ssh 用户名port:"", //端口password: "", // ssh 密码path: '/opt/html/', // 操作开始文件夹 可以直接指向配置好的地址rmpath: '/opt/html' // 需要删除的文件夹
}
index.js
const config = require('./config.js')
const shell = require('shelljs')
const path = require('path');
let Client = require('ssh2-sftp-client');
// 打包 npm run build
const compileDist = async () => {if(shell.exec(`npm run build`).code==0) {console.log("打包成功")}
}async function connectSSh() {let sftp = new Client();sftp.connect({host: config.ip, // 服务器 IPport: config.port,username: config.username,password: config.password}).then(() => {console.log("先执行删除服务器文件")return sftp.rmdir(config.rmpath, true);}).then(() => {// 上传文件console.log("开始上传")return sftp.uploadDir(path.resolve(__dirname, '../dist'), config.path);}).then((data) => {console.log("上传完成");sftp.end();}).catch((err) => {console.log(err, '失败');sftp.end();});
}
async function runTask() {await compileDist() //打包完成await connectSSh() //提交上传
}
runTask()
https://nodejs.cn/api/child_process.html#child_processexecsynccommand-options
介绍
child_process是node提供的一个子进程AP,具体可见官网、中文网关于此类api的介绍,对衍生shell及参数有非常详细的说明,下面列出两个常用的api
child_process.exec(command[, options][, callback])
command:要运行的shell命令
创建一个新的shell进程,然后执行command
child_process.execFile(file[, args][, options][, callback])
file:要运行的文件名称或路径,参数作为数组传入
直接将可执行的file创建为新进程;需要单独写.sh文件,可编写复杂逻辑,但在windows上使用时会有兼容问题(此外,还有child_process.spawn()等可供选择)
示例:
const util = require('util');
const child_process = require(‘child_process');
// 调用util.promisify方法,返回一个promise,如const { stdout, stderr } = await exec('rm -rf build')
const exec = util.promisify(child_process.exec);
const appPath = join(__dirname, 'app');const runClean = async function () {// cwd指定子进程的当前工作目录 这里的rm -rf build为删除指定目录下的一个文件夹await exec(`rm -rf build`, { cwd: appPath });await exec(`rm -rf test`, { cwd: appPath });
runClean();
鉴于上个例子,执行shell脚本操作git,其实对于复杂的git命令语句,写起来还是很不方便,最后介绍一个专为git设计的插件:simple-git(npm地址)
介绍
示例
以下为客户端项目通过ipc通信,处理git的请求
const simpleGit = require('simple-git/promise');......// 执行客户端模拟的 simple-git 函数
ipcMain.handle('simple-git', async function (e, { projectPath, cmd, args }) {const git = simpleGit(projectPath);try {const res = await git[cmd](...args);return res;} catch (e) {console.error('执行 simple-git 命令时发生错误', { projectPath, cmd, args }, e);throw e;}
});