UNPKG

@lark-project/cli

Version:

飞书项目插件开发工具

53 lines (52 loc) 1.99 kB
"use strict"; 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;