Bazel 监视器
注:这不是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
链接
软件包可供下列分发:
- 阿尔奇 Linux数字 :
aur/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_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 文件 这里。下面是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. 好吧,预留.