@bazel/ibazel

中文文档
0.28.0发布于 2025/12/06Apache-2.0零依赖近 30 天下载 191万

巴泽尔的节点分布

中文使用文档
文档目录18 节
  1. 安装
  2. 麦克( Homebrew)
  3. 国家预防机制
  4. 链接
  5. 自己编曲
  6. 运行目标
  7. 输出运行器
  8. 禁用输出运行器
  9. 剖析
  10. 剖析器事件
  11. 事件属性
  12. 示例配置文件输出文件
  13. 远程事件
  14. 自定义远程事件
  15. 补充说明
  16. 终止
  17. 怎么样 --watchfs 旗帜?
  18. 谢谢

Bazel 监视器

Build status

注:这不是Google的官方产品.

源文件监视器 巴泽尔 项目

曾经想要保存一个文件并让测试自动运行吗? 怎么样 当一个源文件更改时重新启动您的网络服务器吗 ? 别再看了.

安装 ibazel 使用三种方法之一 说明如下:。然后:

$ ibazel build //path/to/my:target

黑客黑客攻击。 保存,你的目标将重建.

现在这回波支持 build, (中文(简体) ), test,以及 run。 。 。 .

安装

安装iBazel有几种方法,下面有记载.

麦克( Homebrew)

如果你运行一个macOS,你可以安装它从 土生土长。 。 。 .

$ brew install ibazel

国家预防机制

如果你是JS开发商 你可以把它装成一个 devDependency 或打电话 npm install 直接在您的项目中

$ npm install @bazel/ibazel

链接

软件包可供下列分发:

自己编曲

当然,你可以用Bazel建造iBazel.

$ git clone [email protected]:bazelbuild/bazel-watcher
$ cd bazel-watcher
$ bazel build //cmd/ibazel

现在将生成的二进制复制到您的路径 :

$ export PATH=$PATH:$PWD/bazel-bin/cmd/ibazel/ibazel_

运行目标

默认情况下,一个目标开始于 ibazel run 将终止并重新启动 每当它接到关于源变化的通知。 或者,如果构建规则 您的目标包含 ibazel_notify_changes 联合国 tags 属性,然后是 命令将保持生命,并将收到源更改的通知 斯丁语.

输出运行器

iBazel 能够从 Bazel 输出生成和运行命令 命令。 如果iBazel 与旗帜运行 --run_output 然后它会检查 (单位:千美元) %WORKSPACE%/.bazel_fix_commands.json 如果当前运行任何命令 匹配提供的正则表达式。 例如,定义的命令 以下文件将匹配 buildozer 在输出和输出中找到的命令 提供运行命令和引用的提示 bazel run //:gazelle 若为 它检测出您输入码缺失的导入 .

[
  {
    "regex": "^Check that imports in Go sources match importpath attributes in deps.$",
    "command": "bazel",
    "args": [ "run", "//:gazelle" ]
  },
  {
    "regex": "^buildozer '(.*)'\\s+(.*)$",
    "command": "buildozer",
    "args": [ "$1", "$2" ]
  },
  {
    "regex": "^(\\S+)/[\\w-]+\\.proto:\\d+:\\d+: Import \"\\S+\" was not found or had errors\\.$",
    "command": "bazel",
    "args": [ "run", "//:gazelle", "--", "proto/$1" ]
  }
]

添加旗帜 --run_output_interactive=false 将自动运行 命令时不提示确认。 田间 .bazel_fix_commands.json 它们是:

  • regex: 正则表达式,将与每行 输出.
    • 反斜线 \ 字符需要跳出一次, 才能让正则 正确解析.
  • command: 从工作空间根运行的命令.
  • args: 向命令提供参数列表, 替换 $1 与第一个匹配组 regex, (中文(简体) ), $2 与第二个等,以及 $0 整个比赛.

您可以通过添加旗子来禁用此特性 --run_output=false 或者你能够 创建一个 .bazel_fix_commands.json 包含一个空的json数组, []。 。 。 . 这将进一步禁用提供使用指令的通知 第一次引用iBazel.

禁用输出运行器

如果您想要删除横幅, 但不希望配置输出 运行中,您可以创建这样的空配置文件 :

echo "[]" > .bazel_fix_commands.json

当iBazel开始的时候,你不应该再受到刺激.

剖析

iBazel有一个 --profile_dev 打开生成的配置文件输出文件的旗帜 关于构建过程和时机。 要使用它将这面旗帜包括在命令行中. 譬如说,

ibazel --profile_dev=profile.json run devserver

Profile出炉格式为相容JSON格式. 每行输出一个事件.

剖析器事件

活动说明属性(* 可选)
IBAZEL_STARTIBazel 作为第一次迭代的一部分启动时发送type, (中文(简体) ), iteration, (中文(简体) ), time, (中文(简体) ), iBazelVersion, (中文(简体) ), bazelVersion, (中文(简体) ), maxHeapSize, (中文(简体) ), committedHeapSize
SOURCE_CHANGE检测到源文件更改type, (中文(简体) ), iteration, (中文(简体) ), time, (中文(简体) ), targets, (中文(简体) ), elapsed, (中文(简体) ), change
GRAPH_CHANGE检测到构建文件更改type, (中文(简体) ), iteration, (中文(简体) ), time, (中文(简体) ), targets, (中文(简体) ), elapsed, (中文(简体) ), changes* 联合国
RELOAD_TRIGGERED任何监听浏览器都触发了活重载type, (中文(简体) ), iteration, (中文(简体) ), time, (中文(简体) ), targets, (中文(简体) ), elapsed, (中文(简体) ), changes* 联合国
RUN_START运行操作开始type, (中文(简体) ), iteration, (中文(简体) ), time, (中文(简体) ), targets, (中文(简体) ), elapsed, (中文(简体) ), changes* 联合国
RUN_FAILED运行操作失败type, (中文(简体) ), iteration, (中文(简体) ), time, (中文(简体) ), targets, (中文(简体) ), elapsed, (中文(简体) ), changes* 联合国
RUN_DONE运行操作成功type, (中文(简体) ), iteration, (中文(简体) ), time, (中文(简体) ), targets, (中文(简体) ), elapsed, (中文(简体) ), changes* 联合国
BUILD_START开始建设操作type, (中文(简体) ), iteration, (中文(简体) ), time, (中文(简体) ), targets, (中文(简体) ), elapsed, (中文(简体) ), changes* 联合国
BUILD_FAILED构建操作失败type, (中文(简体) ), iteration, (中文(简体) ), time, (中文(简体) ), targets, (中文(简体) ), elapsed, (中文(简体) ), changes* 联合国
BUILD_DONE建筑作业成功完成type, (中文(简体) ), iteration, (中文(简体) ), time, (中文(简体) ), targets, (中文(简体) ), elapsed, (中文(简体) ), changes* 联合国
TEST_START开始测试操作type, (中文(简体) ), iteration, (中文(简体) ), time, (中文(简体) ), targets, (中文(简体) ), elapsed, (中文(简体) ), changes* 联合国
TEST_FAILED测试操作失败type, (中文(简体) ), iteration, (中文(简体) ), time, (中文(简体) ), targets, (中文(简体) ), elapsed, (中文(简体) ), changes* 联合国
TEST_DONE测试操作成功type, (中文(简体) ), iteration, (中文(简体) ), time, (中文(简体) ), targets, (中文(简体) ), elapsed, (中文(简体) ), changes* 联合国
REMOTE_EVENT从浏览器收到远程事件type, (中文(简体) ), iteration, (中文(简体) ), time, (中文(简体) ), targets, (中文(简体) ), elapsed, (中文(简体) ), remoteType, (中文(简体) ), remoteTime, (中文(简体) ), remoteElapsed, (中文(简体) ), remoteData
REMOTE_EVENT / PAGE_LOAD浏览器上的配置程序客户端脚本发布的远程事件 load 活动. remoteType 实值 PAGE_LOAD。 。 。 .type, (中文(简体) ), iteration, (中文(简体) ), time, (中文(简体) ), targets, (中文(简体) ), elapsed, (中文(简体) ), remoteType, (中文(简体) ), remoteTime, (中文(简体) ), remoteElapsed, (中文(简体) ), remoteData

事件属性

属性类型说明
type字符串事件类型.
iteration字符串独建迭代键.
time整数事发时间.
targets字符串 []正在建设的目标清单(注:这是一个完整的清单,包括重复之前已经建设的目标).
elapsed整数迭代开始后,时间逐渐减少.
change字符串文件在 a 上更改 SOURCE_CHANGE 或者说 GRAPH_CHANGE 活动.
changes字符串 []构建迭代期间累积更改的文件列表 .
iBazelVersion字符串生成此事件的 IBazel 版本 .
bazelVersion字符串正在使用的 Bazel 版本 .
maxHeapSize字符串巴泽尔报道的最大的堆积大小.
committedHeapSize字符串巴泽尔报告的重磅大小.
remoteType字符串子类型 REMOTE_EVENT 类型.
remoteTime编号浏览器时间 REMOTE_EVENT 类型.
remoteElapsed编号浏览器中耗去的时间 navigationStart 页:1 REMOTE_EVENT 类型.
remoteData字符串从浏览器发送的数据 REMOTE_EVENT 类型。 对于一些远程事件来说,这可能是以逃避的JSON格式.

示例配置文件输出文件

您可以找到一个实例配置文件输出 JSON 文件 这里。下面是JSON格式的相当平整的文件 :

{
  "type": "IBAZEL_START",
  "iteration": "4214114686684e0f",
  "time": 1513706108351,
  "iBazelVersion": "v0.2.0-dirty",
  "bazelVersion": "release 0.8.1-homebrew",
  "maxHeapSize": "3817MB",
  "committedHeapSize": "1372MB"
}
{
  "type": "RUN_START",
  "iteration": "4214114686684e0f",
  "time": 1513706109329,
  "targets": [
    "//src:devserver"
  ],
  "elapsed": 978
}
{
  "type": "RELOAD_TRIGGERED",
  "iteration": "4214114686684e0f",
  "time": 1513706114595,
  "targets": [
    "//src:devserver"
  ],
  "elapsed": 6244
}
{
  "type": "RUN_DONE",
  "iteration": "4214114686684e0f",
  "time": 1513706114595,
  "targets": [
    "//src:devserver"
  ],
  "elapsed": 6244
}
{
  "type": "SOURCE_CHANGE",
  "iteration": "7e6f8e150e9a8367",
  "time": 1513706129384,
  "targets": [
    "//src:devserver"
  ],
  "change": "/Users/greg/google/gregmagolan/angular-bazel-example/src/hello-world/hello-world.component.ts"
}
{
  "type": "RUN_START",
  "iteration": "7e6f8e150e9a8367",
  "time": 1513706129484,
  "targets": [
    "//src:devserver"
  ],
  "elapsed": 100,
  "changes": [
    "/Users/greg/google/gregmagolan/angular-bazel-example/src/hello-world/hello-world.component.ts"
  ]
}
{
  "type": "RELOAD_TRIGGERED",
  "iteration": "7e6f8e150e9a8367",
  "time": 1513706133947,
  "targets": [
    "//src:devserver"
  ],
  "elapsed": 4563,
  "changes": [
    "/Users/greg/google/gregmagolan/angular-bazel-example/src/hello-world/hello-world.component.ts"
  ]
}
{
  "type": "RUN_DONE",
  "iteration": "7e6f8e150e9a8367",
  "time": 1513706133947,
  "targets": [
    "//src:devserver"
  ],
  "elapsed": 4563,
  "changes": [
    "/Users/greg/google/gregmagolan/angular-bazel-example/src/hello-world/hello-world.component.ts"
  ]
}
{
  "type": "REMOTE_EVENT",
  "iteration": "7e6f8e150e9a8367",
  "time": 1513706134297,
  "targets": [
    "//src:devserver"
  ],
  "elapsed": 4913,
  "remoteType": "PAGE_LOAD",
  "remoteTime": 1513706134294,
  "remoteElapsed": 346,
  "remoteData": "{\"pageLoadTime\":344,\"fetchTime\":9,\"connectTime\":0,\"requestTime\":6,\"responseTime\":6,\"renderTime\":325,\"navigationStart\":1513706133948,\"unloadEventStart\":1513706133962,\"unloadEventEnd\":1513706133962,\"redirectStart\":0,\"redirectEnd\":0,\"fetchStart\":1513706133952,\"domainLookupStart\":1513706133952,\"domainLookupEnd\":1513706133952,\"connectStart\":1513706133952,\"connectEnd\":1513706133952,\"secureConnectionStart\":0,\"requestStart\":1513706133955,\"responseStart\":1513706133955,\"responseEnd\":1513706133961,\"domLoading\":1513706133967,\"domInteractive\":1513706134222,\"domContentLoadedEventStart\":1513706134222,\"domContentLoadedEventEnd\":1513706134222,\"domComplete\":1513706134292,\"loadEventStart\":1513706134292}"
}

远程事件

远程事件需要客户端剖析脚本. 如果你正在使用这个 ts_devserver bazel 规则,此脚本会自动包含在开发包中,这样你不必担心会包含它. 如果你没有用 ts_devserver 对于开发模式,您可以包含以下脚本标记来拉入客户端侧剖析脚本:

<script src="http://localhost:30000/profiler.js"></script>

脚本由iBazel默认在30000端口提供. 如果30000港口没有可用,iBazel将试图在30001至30099之间找到另一个可用的港口.

配置文件脚本中的远程事件使用 灯塔API。该API可在Chrome 39、Firefox 31、Edge和Opera 26中获取。 在Internet Explorer 或 Safari 中找不到。 浏览器兼容性可以检查 这里。 。 。 .

如果您的浏览器不支持Beacon API,您在包含配置器脚本时会在控制台中看到以下错误: iBazel profiler disabled because Beacon API is not available。 。 。 .

自定义远程事件

当配置文件脚本被装入时, a window.IBazelProfileEvent(eventType, data) 公共API用于生成自定义远程事件。 此函数将自定义的REMOTE EVENT发送给了 iBazel 配置日志 .

参数类型说明
eventType字符串事件类型, 最终在REMOTE EVENT 的 “ 远程” 属性中 .
data任意与事件相关的可选数据. 此被转换为字符串 。 如果它是一个对象, 它将被转换为在配置日志中逃脱的 JSON .

补充说明

终止

SIGINT必须两次被发送去杀死Bazel:一次结束子进程, 也是巴泽尔的第二次 而且,当一个 bazel 查询失败, 但是当一个构建、 测试或运行失败时, 它会继续活着 . 我们使用3的退出代码 用于信号终止,4用于查询失败. 这些代码不是API,随时可能改变.

怎么样 --watchfs 旗帜?

巴泽尔的旗子叫做 --watchfs 根据bazel命令线 帮助

如果选中的话, Bazel 试图使用操作系统的文件监视服务 本地更改而不是扫描每个文件进行更改

不幸的是,这个选项没有像Bazel那样重建项目 监视器确实如此,但是要查询文件系统,以获取一个文件列表 自上次建造以来已作废,需要巴泽尔号重新检查 服务器.

谢谢

版权2017 Bazel Authors. 好吧,预留.

版本与发布记录

@bazel/ibazel 共发布 41 个版本,首次发布于 2017/10/04;过去 12 个月发布了 1 个版本。

版本发布日期距今
0.28.0latest2025/12/0611 个月前
0.27.02025/10/091.1 年前
0.26.102025/08/251.2 年前
0.25.02024/03/202 年前
0.24.02023/11/282 年前
0.23.72023/08/083 年前

关于 @bazel/ibazel 的常见问题

@bazel/ibazel 是什么?

巴泽尔的节点分布

如何安装 @bazel/ibazel?

在项目目录运行 npm install @bazel/ibazel,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 ibazel,可以用 npx ibazel 直接运行。

@bazel/ibazel 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/bazel__ibazel 是否存在。

@bazel/ibazel 可以商用吗?

@bazel/ibazel 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@bazel/ibazel 的下载量有多少?

根据 npm 官方下载统计,@bazel/ibazel 在 2026/10/08 – 2026/11/06 这 30 天内被下载 1,909,748 次,日均约 63,658 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@bazel/ibazel 还在维护吗?

最新版本 0.28.0 发布于 2025/12/06(11 个月前);至今共发布 41 个版本,其中过去 12 个月发布了 1 个;首次发布于 2017/10/04。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。