@lark-project/cli
Version:
飞书项目插件开发工具
53 lines (52 loc) • 1.99 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const cross_spawn_1 = __importDefault(require("cross-spawn"));
const logger_1 = require("./logger");
// 使用 any 因为最新的 Node.js types 已经移除了 Process.binding() 方法
const signals = process.binding('constants').os.signals;
function processExitWithLog(err) {
if (err.message) {
logger_1.logger.error(err.message);
logger_1.logger.debug(`child process exec failed, ${err}`);
}
else {
logger_1.logger.error(`child process exec failed, ${err}`);
}
logger_1.logger.shutdown(() => {
process.exit(1);
});
}
const runScript = (scriptPath, args) => {
const child = (0, cross_spawn_1.default)(process.execPath, [scriptPath, ...(args || [])], {
stdio: 'inherit',
});
/**
* SIGKILL是一个不能被忽略的信号,在操作系统层面它是用来立即终止进程的,所以你无法使用 process.on() 来注册一个处理SIGKILL的回调函数。
* 因此,当你尝试在 SIGKILL 信号上使用 process.on() 时,它会抛出一个错误,告诉你 EINVAL (invalid argument),因为这不是一个合法的操作。
* 如果你要使用SIGKILL信号,只能是在命令行终端中使用 kill 命令来强制进程终止。
*/
[
'SIGINT', // ctrl + c
// 'SIGKILL', // force exit
'SIGTERM',
].forEach(signal => {
process.on(signal, () => {
const signalValue = signals[signal];
child.kill(signalValue);
});
});
child.on('error', err => {
processExitWithLog(err);
});
child.on('exit', code => {
process.exit(code);
});
return child;
};
process.on('unhandledRejection', (err) => {
processExitWithLog(err);
});
exports.default = runScript;