常见问题解答

如何报告错误?

针对 mach 核心的错误可以在 Bugzilla 中的 Firefox 构建系统::Mach 核心 组件中提交。

注意

大多数 mach 错误是单个命令中的错误,而不是核心 mach 代码中的错误。单个命令的错误应针对该命令相关的组件提交。例如,build 命令中的错误应针对Firefox 构建系统::常规提交。针对测试命令的错误应提交到测试产品中的某个位置。

如何调试命令因 Python 异常而失败?

您可以运行一个命令并在命令被调用时进入 pdb(Python 调试器),方法如下

./mach --debug-command FAILING-COMMAND ARGS ...

如何调试 mach 本身?

如果您正在编辑 mach 代码或其他 Python 模块,您可以打开终端并使用以下命令启动 pdb 调试:

python3 -m pdb ./mach <command>

如何调试 pytest 测试?

首先,在调试之前,运行 ./mach python-test 一次以确保测试虚拟环境是最新的

./mach python-test path/to/test.py

然后,使用测试虚拟环境,调试测试文件

<objdir>/_virtualenvs/python-test/bin/python -m pdb path/to/test.py

如何分析缓慢的命令?

为了诊断瓶颈,您可以收集性能分析信息

./mach --profile-command SLOW-COMMAND ARGS ...

然后,您可以使用 snakeviz 可视化 mach_profile_SLOW-COMMAND.cProfile

# If you don't have snakeviz installed yet:
python3 -m pip install snakeviz
python3 -m snakeviz mach_profile_SLOW-COMMAND.cProfile

如何分析 mach 本身?

由于 --profile-command 仅分析命令,因此您需要直接调用 cProfile 来分析 mach 本身

python3 -m cProfile -o mach.cProfile ./mach ...
python3 -m snakeviz mach.cProfile

mach 是构建系统吗?

不是。 mach 只是一个通用的命令分发工具,碰巧有一些命令与真正的构建系统交互。从历史上看,mach 诞生是为了成为构建系统的一个更好的接口。但是,它超越构建系统交互的潜力很快就被认识到,并且 mach 发展壮大以满足这些需求。

如何向 mach 添加功能?

如果您想向 mach 添加无法作为 mach 命令实现的新功能,第一步是在 Firefox 构建 系统 :: Mach 核心 组件中提交一个错误。

我应该将 X 实现为 mach 命令吗?

没有硬性规定。一般来说,如果您有一些对多人有用的功能或操作(尤其是在提高生产力方面),那么您应该考虑为此实现一个 mach 命令。

还有一些其他情况下,您应该考虑将某些内容实现为 mach 命令

  • 当您的工具是树中的随机脚本时。随机脚本很难找到,并且可能不符合编码约定或最佳实践。 Mach 提供了一个框架,您的工具可以生活在这个框架中,这将使其比独自存在时更有可能成功。

  • 当替代方案是 make 目标时。构建团队通常不喜欢不属于构建(即编译)树的单次 make 目标。这包括与测试和打包相关的事项。这些会拖累 Makefiles 并增加维护构建系统的负担。相反,建议您使用 Python 实现辅助功能。如果您确实使用 Python 实现了一些功能,则将其连接到 mach 通常非常简单。

如何在 mach 命令中使用第三方 Python 包?

参见 使用第三方 Python 包

mach 如何融入模块系统?

Mozilla 使用 模块治理系统,其中包含具有不同所有者的不同组件。目前还没有 mach 模块。可能永远不会有,也可能会有;目前 mach 由构建团队拥有。

即使建立了 mach 模块,mach 命令模块也不太可能属于它。相反,mach 命令模块由拥有其交互系统的团队/模块拥有。换句话说,mach 并不是为了集中工具的权限而进行的权力争夺。相反,它旨在通过一个通用、共享的接口公开这些工具。

联系谁寻求帮助或报告问题?

您可以在 #build 中提问。