常见问题解答¶
如何报告错误?¶
针对 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 中提问。