任务生成¶
许多选择器(包括 chooser
、coverage
和 fuzzy
)通过在本地构建 taskgraph 模块,直接从该模块获取其可用的任务。这意味着可用任务列表永远不会过时。虽然这非常强大,但它带来的性能成本也相当大,会让人感到恼火(大约 20 秒)。
taskgraph 生成的结果将被缓存,因此这种开销只会出现在 /taskcluster
目录中的文件被修改时。不幸的是,此目录变化非常频繁,因此开发人员每次拉取 mozilla-central
时都需要重建缓存。经常在 /taskcluster
上工作的开发人员可能会更频繁地重建。
配置 Watchman¶
可以通过使用文件监视服务 watchman 完全绕过此开销。如果您使用 fsmonitor
mercurial 扩展,则已经安装了 watchman
。
注意
如果您没有使用 fsmonitor,但最终还是安装了 watchman,您不妨启用它以获得更快的 Mercurial 体验。
否则,请 安装 watchman。如果使用 Linux,由于 mozilla-central
的大小,您可能会遇到该页面中概述的 inotify 限制。您可以 阅读此页面,以获取有关如何永久提高限制的更多信息。
接下来运行以下命令
$ cd path/to/mozilla-central
$ watchman watch .
$ watchman -j < tools/tryselect/watchman.json
您应该看到类似以下的输出
{
"triggerid": "rebuild-taskgraph-cache",
"disposition": "created",
"version": "20200920.192359.0"
}
就是这样。现在,只要 /taskcluster
下的文件被修改(无论是通过您的编辑器还是通过更新版本控制),taskgraph 缓存就会在后台重建,允许您在下次运行 mach try
时跳过等待。
注意
Watchman 触发器是持久的,无需多次添加。有关如何删除触发器的信息,请参阅 管理触发器。
您可以通过运行以下命令测试一切是否正常
$ statedir=`mach python -c "from mach.util import get_state_dir; print(get_state_dir(specific_to_topsrcdir=True))"`
$ rm -rf $statedir/cache/taskgraph
$ touch taskcluster/mach_commands.py
# wait a minute for generation to trigger and finish
$ ls $statedir/cache/taskgraph
如果 target_task_set
文件存在,则表示一切就绪。否则,您可以查看 watchman
日志以查看是否存在任何错误。此日志通常位于类似 /usr/local/var/run/watchman/$USER-state/log
的位置。在这种情况下,请在 Firefox Build System :: Try
下提交错误,并包含日志的相关部分。
在启动时运行 Watchman¶
Watchman 既是客户端也是服务。在运行 watchman
命令时,如果服务未运行,客户端二进制文件将在后台启动服务。这意味着在重新引导后,服务将不会运行,您需要每次通过调用客户端二进制文件(例如,通过运行 watchman version
)来启动服务。
如果您希望自动执行此操作,可以使用您喜欢的平台特定方法在启动时运行命令(crontab
、rc.local
等)。Watchman 为每个用户存储单独的状态,因此请确保以设置触发器的用户的身份运行该命令。
设置 systemd 服务¶
如果 systemd
是一个选项,您可以创建一个服务
[Unit]
Description=Watchman for %i
After=network.target
[Service]
Type=simple
User=%i
ExecStart=/usr/local/bin/watchman --log-level 1 watch-list -f
ExecStop=/usr/local/bin/watchman shutdown-server
[Install]
WantedBy=multi-user.target
将此保存到名为 /etc/systemd/system/[email protected]
的文件中。然后运行
$ sudo systemctl enable watchman@$USER.service
$ sudo systemctl start watchman@$USER.service
下次重新引导时,watchman 服务应自动启动。
管理触发器¶
添加触发器时,watchman 会将其写入磁盘。通常,它将是类似 /usr/local/var/run/watchman/$USER-state/state
的路径。虽然手动编辑该文件可以工作,但 watchman 二进制文件提供了一个用于管理触发器的界面。
要查看您当前正在监视的所有目录
$ watchman watch-list
要查看在指定监视中处于活动状态的触发器
$ watchman trigger-list <path>
要从指定监视中删除触发器
$ watchman trigger-del <path> <name>
在以上两个示例中,将 <path>
替换为监视的路径,可能是 mozilla-central
。如果这已经是您的工作目录,则使用 .
也适用。有关管理触发器和参考其他命令的更多信息,请参阅 官方文档。