Sabrina 2019-11-09
想在工具里面执行 shell 进行部分命令行交互
基于 微软开源的 xterm.js 和 nodepty
https://github.com/microsoft/xterm.js 前端
https://github.com/microsoft/node-pty 后台
index.html 文件
<!doctype html>
<html>
<link rel="stylesheet" href="node_modules/xterm/css/xterm.css" />
<body>
<div id="terminal"></div>
</body>
<script>
// No idea what these are about. Just copied them from the demo code
window.require = window.parent.require;
var global_xterm = undefined;
var global_pty = undefined;
function testbtnclick(){
var os = require(‘os‘);
var process = require(‘process‘);
var pty = require(‘node-pty‘);
var Terminal = require(‘xterm‘).Terminal;
var FitAddon = require(‘xterm-addon-fit‘).FitAddon
// Initialize node-pty with an appropriate shell
const shell = process.env[os.platform() === ‘win32‘ ? ‘COMSPEC‘ : ‘SHELL‘];
console.log("shell = " + shell);
console.log("process.env = ", process.env);
const ptyProcess = pty.spawn(shell, [], {
name: ‘xterm-color‘,
cols: 80,
rows: 34,
cwd: process.cwd(),
env: process.env
});
// Initialize xterm.js and attach it to the DOM
const xterm = new Terminal({
cols: 80,
rows: 34,
cursorBlink: true,
});
xterm.open(document.getElementById(‘terminal‘));
global_xterm = xterm;
global_pty = ptyProcess;
const fitaddon = new FitAddon();
xterm.loadAddon(fitaddon);
fitaddon.fit()
// Setup communication between xterm.js and node-pty
xterm.onData(data => ptyProcess.write(data));
ptyProcess.on(‘data‘, function (data) {
xterm.write(data);
});
}
function shellEnter(workpath){
if (global_pty){
global_pty.write("cd " + workpath +"\n");
setTimeout(() => {
global_pty.write("fastlane deliver \n");
}, 2);
}
}
</script>
</html>一定要注意 nodepty 和 electron 的版本要对应上 否则 会有各种各样的报错 当初在这里纠结了将近3天 简直崩溃。
node-pty 有对应 nodejs 的版本 还有对应 electron 的版本 无法通用
这里贴出我 package.json 文件, 这里标记了 electron node-pty 和 nodej 对应的版本
{
"name": "fileinfotool",
"version": "0.1.0",
"main": "main.js",
"scripts": {
"rebuild": "electron-rebuild -f -w node-pty"
},
"dependencies": {
"electron": "^5.0.11",
"iconv-lite": "^0.5.0",
"node-pty": "^0.8.1",
"xterm": "^4.1.0",
"xterm-addon-fit": "^0.2.1",
"image-size": "^0.7.4"
},
"devDependencies": {
"electron-rebuild": "^1.8.6"
}
}