# @bazel/ibazel 中文文档

规范地址：https://npmcn.com/package/%40bazel/ibazel/

版本：0\.28\.0
npm 元数据更新时间：2025-12-05T19:51:30.536Z
中文译文更新时间：2026-11-07T18:37:25.651Z
软件包许可：Apache-2\.0

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40bazel/ibazel
原文对照：https://npmcn.com/package/%40bazel/ibazel/?lang=original

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：41.1 MB，8 个文件
- TypeScript 类型：未声明
- 运行依赖：0 个
- 首次发布：2017-10-03T23:07:27.544Z
- 最新版本发布：2025-12-05T19:51:30.273Z
- 近 30 天下载量：1909748（2026-10-08 至 2026-11-06，npm 官方下载统计）
- 已发布版本数：41（近 12 个月 1 个）

## 中文简介

巴泽尔的节点分布

## 安装

```sh
npm install @bazel/ibazel
```

也可以使用：`pnpm add @bazel/ibazel`、`yarn add @bazel/ibazel`、`bun add @bazel/ibazel`

## README

# Bazel 监视器

[![Build status](https://badge.buildkite.com/7694a2e22dcb7ea2e2ec80bb7e8e0380c700079e761394096f.svg?branch=master)](https://buildkite.com/bazel/bazel-watcher-postsubmit)

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

源文件监视器 [巴泽尔](https://bazel.build/) 项目

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

安装 `ibazel` 使用三种方法之一 [说明如下:](https://npmcn.com/package/%40bazel/ibazel/#readme-installation)。然后:

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

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

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

## 安装

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

### 麦克( Homebrew)

如果你运行一个macOS,你可以安装它从 [土生土长](https://brew.sh/)。 。 。 .

```sh
$ brew install ibazel
```

### 国家预防机制

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

```
$ npm install @bazel/ibazel
```

### 链接

软件包可供下列分发:

-   **阿尔奇 Linux**数字 : [`aur/ibazel`](https://aur.archlinux.org/packages/ibazel)

### 自己编曲

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

```
$ git clone git@github.com:bazelbuild/bazel-watcher
$ cd bazel-watcher
$ bazel build //cmd/ibazel
```

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

```bash
$ 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.

### 禁用输出运行器

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

```sh
echo "[]" > .bazel_fix_commands.json
```

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

## 剖析

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

```
ibazel --profile_dev=profile.json run devserver
```

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

### 剖析器事件

| 活动 | 说明 | 属性(\* 可选) |
| --- | --- | --- |
| `IBAZEL_START` | IBazel 作为第一次迭代的一部分启动时发送 | `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 文件 [这里](https://github.com/bazelbuild/bazel-watcher/blob/master/example.profile.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](https://developer.mozilla.org/en-US/docs/Web/API/Beacon_API)。该API可在Chrome 39、Firefox 31、Edge和Opera 26中获取。 在Internet Explorer 或 Safari 中找不到。 浏览器兼容性可以检查 [这里](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon#Browser_compatibility)。 。 。 .

如果您的浏览器不支持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那样重建项目 监视器确实如此,但是要查询文件系统,以获取一个文件列表 自上次建造以来已作废,需要巴泽尔号重新检查 服务器.

### 谢谢

-   [谷歌](http://opensource.google.com/) 用于跨平台构建/测试 CI 实例.
-   [苏塞实验室](https://saucelabs.com/) 用于交叉浏览器测试.

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

## 常见问题

### @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 和提交记录判断。

