多调试器
在终端中以标签方式显示多个日志流
本模块收集多个逻辑上分离的日志流 ("tabs") 和 使其进入终端,进程已经进入。 附上时 到交互式终端,它绘制一个全屏制表UI 墨迹; 否则( CI, 有管输出) 返回到带有有色标记的仅附加行前缀。 线条可能包含 ANSI的造型,所以任何在终端能制成的东西都可以被接入.
使用量
import Logger from '@electron-forge/multi-logger';
const logger = new Logger({ title: 'My tool' });
const serverTab = logger.createTab('Server');
const frontEndTab = logger.createTab('Front End');
// Everything logged before start() is buffered and shown once rendering begins.
serverTab.setStatus({ state: 'building' });
serverTab.log('listening on :3000');
serverTab.setStatus({ state: 'success', durationMs: 1200 });
// Pipe a child process's stdout/stderr into a tab of its own.
logger.attachProcess(spawn('node', ['server.js']), 'Server');
await logger.start();
// Later: restore the terminal. Safe to call more than once, and it also runs
// on process exit so a crash never leaves the terminal in the alternate screen.
logger.stop();
API 密码
new Logger(options?)
| 选项 | 说明 |
|---|---|
stdout | 顺流而上 默认为 process.stdout。 。 。 . |
stdin | 流到读取密钥 。 默认为 process.stdin。 。 。 . |
interactive | 是否使用带有标签的 UI 。 默认为 stdout.isTTY && stdin.isTTY && !process.env.CI。 。 。 . |
forceMode | 'ink' 或者说 'plain' 绕过检测. |
title | 在标签栏左侧显示文本 . |
keys | 额外的热门, { key, label, onPress },在页脚上列出. |
maxLines | 每分页保留行(并用于合并视图). 默认为5000. |
initialTab | 首先显示标签的名称,或 'all' 用于合并视图。 第一个标签的默认值 . |
errorSwitchDebounceMs | 自动切换到失败的标签之间的最小间隔 。 默认为 15000. |
logger.createTab(name)返回 aTab。 。 。 .logger.getTab(name)编号 :logger.getTabs()。 。 。 .logger.attachProcess(child, name = 'App')给孩子管子stdout财务报告和审定财务报表stderr输入分行的分页,并在分页结束时标出分页. 同名的标签被再用,所以一个重新启动的进程会保留其标签. 当孩子离开时, Stdin 会被放回原始模式,以防孩子死亡 继承了终端,并在出站途中重新设置(节点嵌入器等) 电能做);logger.reassertRawMode()按要求做同样的事情.logger.start()开始渲染 在此之前,一切被缓冲.logger.stop()卸载 UI并恢复终端。 如果UI从不 将缓冲行作为纯文本写入 无所失也.logger.extendOptions({ keys?, title?, initialTab? })添加选项 日志创建方式: extrakeys(已绑定的密钥已离开) (b) 单独审议)title编号 :initialTab当还没有确定的时候。 它没有影响 一次乌伊start()已被调用.
共享一个数据包
一个进程只能明智地绘制一个 UI, 所以一个主机和运行中的插件 内部应该共享一个日志,而不是各自创建自己的日志:
import { ensureSharedLogger } from '@electron-forge/multi-logger';
// The host creates it. The first caller decides how it is set up…
const logger = ensureSharedLogger({ title: 'My tool', initialTab: 'App' });
// …and a plugin, later, just adds a tab to it.
const tab = ensureSharedLogger().createTab('Bundler');
ensureSharedLogger(options?)返回全进程日志,创建它 在第一个呼叫。 以后的电话options通过下列方式合并:extendOptions(): 额外keys添加,title编号 :initialTab被带入 惟有尚未确定,其他一切被忽略.getSharedLogger()返回,或undefined如果没有人创建.resetSharedLogger()忘记它而不阻止它; 意在测试.
案件登记如下: Symbol.for('@electron-forge/multi-logger')
打开 globalThis,因此,甚至两本这个包在一个 node_modules 树
最终分享它.
Tab
tab.log(text)附加文本,其中可能包含多行和ANSI颜色.tab.setStatus({ state, errors?, warnings?, durationMs?, detail? })地点state这是其中之一idle, (中文(简体) ),building, (中文(简体) ),success, (中文(简体) ),warning, (中文(简体) ),error或者说exited。状态显示在标签名称旁边.tab.clear()空出标签的缓冲.
交互式用户界面
Electron Forge · webpack 1 Main Process ✔ 1.2s 2 Renderer (web) ⠹ 3 Preload (electron-preload) ✖ 2 4 App ● a All
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
… the active tab's most recent lines, wrapped to the terminal width …
←/→ 1-9 tabs · a all · r restart electron · c clear · f follow · ↑/↓ scroll · q quit
| 密钥 | 行动 |
|---|---|
← 编号 : →, (中文(简体) ), Tab 编号 : Shift+Tab | 通过标签循环 |
1 改为 9 | 跳转到标签 |
a | 按到达顺序合并每个标签的视图, 并用标签标记 |
↑ 编号 : ↓, (中文(简体) ), PgUp 编号 : PgDn | 通过缓冲器回滚( 停止在后面) |
Home 编号 : End | 跳到最古老的一行/ 回到尾端 |
f | 跟踪尾巴切换 |
c | 清除当前标签( 或合并视图中的每个标签) |
q, (中文(简体) ), Ctrl+C | 恢复终端并重新提升 SIGINT |
自定义 keys | 不论东道主注册什么,例如:. r 要重新启动 |
标签栏总是适合终端:当它被紧紧的长度和
数数先去,然后标题, 最后芯片包装到更多的行.
当标签状态变为 error 视图最多每一次
errorSwitchDebounceMs,因此一系列失败不会与用户对抗.
UI使用终端的可换显示屏,所以无论之前打印过什么
start() 退出时仍在回滚中,并打印出一行
每个标签的状态( 加上以出错结束的任何标签的尾部)
出来.
因为墨水将 stdin 输入到原始模式中, 以行为基础的输入如打字 rs
在 UI 启动时, 主机进程未看到; 主机应当注册
等同的热键通过 keys 换句话说.
普通模式
当stdout或stdin不是TTY,或 CI 设定, 线条按写
到达 :
[Main Process] asset index.js 1.2 KiB [emitted] (name: main)
[Main Process] ✔ compiled in 1.2s
[Renderer (web)] ✖ failed with 1 error in 2.1s