设置

Mach 可以从一组配置文件中读取设置。这些配置文件名为 machrc.machrc,并由引导脚本指定。在 mozilla-central 中,这些文件可以位于 ~/.mozbuild 和/或 topsrcdir 中。

设置可以在任何地方指定,并由 mach 核心或单个命令使用。

核心设置

这些设置由 mach 核心实现。

  • alias - 创建命令别名。如果您想将命令别名为其他内容,可以选择包含一些默认值,这很有用。它可以用于创建全新的命令,或为现有命令提供默认值。例如

[alias]
mochitest = mochitest -f browser
browser-test = mochitest -f browser

定义设置

设置需要显式定义,以及它们的类型,否则 mach 在尝试访问它们时会抛出错误。

要定义设置,请在现有的 mach 命令模块中使用 SettingsProvider() 装饰器。例如

from mach.decorators import SettingsProvider
from mozbuild.base import MachCommandBase

@SettingsProvider
class ArbitraryClassName(MachCommandBase):
    config_settings = [
        ('foo.bar', 'string', "A helpful description"),
        ('foo.baz', 'int', "Another description", 0, {'choices': set([0,1,2])}),
    ]

@SettingsProvider 必须指定一个名为 config_settings 的变量,该变量返回一个元组列表。或者,它可以指定一个名为 config_settings 的函数,该函数返回一个元组列表。

每个元组的格式为

('<section>.<option>', '<type>', '<description>', default, extra)

type 是一个字符串,可以是以下之一:string、boolean、int、pos_int、path

description 是一个字符串,解释如何定义设置以及它们在何处使用。理想情况下,描述应该是多行段落,其中第一行用作简短描述。

default 是可选的,并在任何配置文件中均未指定的情况下提供默认值。

extra 也是可选的,它是一个字典,包含要添加到设置元数据中的其他键/值对。可以在 extra 字典中指定以下键

  • choices - 设置允许的值集。

通配符

有时某个部分应允许用户任意定义选项,例如上面提到的 alias 部分。要定义这样的部分,请使用 * 作为选项名称。例如

('foo.*', 'string', 'desc')

这允许如下所示的配置文件

[foo]
arbitrary1 = some string
arbitrary2 = some other string

查找设置

您可以查看哪些设置可用以及它们的描述和预期值,方法是运行

./mach settings  # or
./mach settings --list

访问设置

现在设置已定义并记录在案,可以从 mach 命令上下文中各个 mach 命令中访问它们。例如

from mach.decorators import (
    Command,
    SettingsProvider,
)
from mozbuild.base import MachCommandBase

@SettingsProvider
class ExampleSettings(object):
    config_settings = [
        ('a.b', 'string', 'desc', 'default'),
        ('foo.bar', 'string', 'desc',),
        ('foo.baz', 'int', 'desc', 0, {'choices': set([0,1,2])}),
    ]

@Command('command', category='misc',
         description='Prints a setting')
def command(command_context):
    settings = command_context._mach_context.settings
    print(settings.a.b)
    for option in settings.foo:
        print(settings.foo[option])