任务生成

许多选择器(包括 choosercoveragefuzzy)通过在本地构建 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)来启动服务。

如果您希望自动执行此操作,可以使用您喜欢的平台特定方法在启动时运行命令(crontabrc.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。如果这已经是您的工作目录,则使用 . 也适用。有关管理触发器和参考其他命令的更多信息,请参阅 官方文档