FFX 配置

借助 FFX 的配置管理功能,您无需重新编译即可配置 FFX 代码。概括来讲,可将配置视为多层键值对映射。

值解析流程

配置管理代码会在多个位置搜索与键关联的值。系统会按以下顺序执行搜索,并返回找到的第一个值:

  1. 运行时配置(由命令行设置)
  2. 用户级配置(由 ffx config set 设置)
  3. build 目录级配置(由 build 生成)
  4. 全局级配置变量
  5. 默认配置(编译为 ffx)

运行时配置

运行时配置由用户在调用 ffx 时在命令行中设置。顶级命令接受配置参数:

$ ffx --config "property-name=value" ...

运行时参数采用逗号分隔的键值对格式(“{key}={value},{key}={value},等等”),因为它不是强类型,因此此处设置的任何配置都将被视为字符串。

守护程序会作为自己的进程运行,目前,如果守护程序已启动,运行时配置不会从 CLI 传输到守护程序。如果您想使用运行时配置配置守护程序,则需要手动运行守护程序命令:

$ ffx --config "config-test=runtime" daemon start --background

用户配置

用户配置是在用户的主目录中设置的配置,适用于该用户对 ffx 的所有调用。只有运行时配置会替换用户配置。

用户配置是使用 ffx config set 命令设置的。

$ ffx config set property-name value

build 目录配置

构建配置与构建目录相关联。它旨在用于设置描述 build 输出的属性。它应在构建过程中生成,并且被 ffx 视为只读。

文件格式为 JSON 对象:

{
    "product": {
        "path": "/out/project/dir/product_bundle",
        "name": "sample_project"
    },
    "fidl": {
        "ir": "$BUILD_DIR/fidling/gen/ir_root"
    }
}

本例中的 $BUILD_DIR 不是 shell 环境变量,而是内部 ffx 变量占位符。如需了解详情,请参阅值表示法

全局配置

全局配置应为系统级配置级别。在主机系统上安装 ffx 时,旨在为一组用户设置相同的组织属性。

该文件是在 ffx 工作流程之外创建的,并且 ffx 会被视为只读文件。

文件格式为 JSON 对象:

{
    "gcs": {
        "release_bucket": "gs://project/releases",
    }
}

默认配置

默认配置通过 GN build 规则在所有子命令中提供,并且是硬编码的,不可更改。

值表示法

存储在 ffx 配置中的值会编码为 JSON 值。

  • 数字,包括整数和浮点数。
  • 字符串
  • 布尔值,true|false。
  • null,表示为 null
  • 值数组
  • 对象

字符串插值

某些字符串可以包含插值的占位符。这样,您就可以相对于目录设置属性,或解析正在运行的进程环境中的值。

ffx 定义的占位符如下:

  • $BUILD_DIR - 运行 ffx 命令时确定的 build 目录。如果未找到或未配置 build 目录,则此值可以为空。
  • $CACHE - 用于存储缓存数据的目录。
  • $CONFIG - 用于存储配置数据的目录。
  • $DATA - 用于存储持久性数据的目录。
  • $SHARED_DATA - 用于存储在当前宿主机上的所有 ffx 隔离容器和实例之间共享的永久性数据的目录。这适用于用于管理全局状态的数据,例如正在打开 TCP/IP 端口的进程。
  • $FIND_WORKSPACE_ROOT - 包含 Bazel 工作区的第一个父级目录。
  • $HOME - 当前用户的主目录。
  • $RUNTIME - 用于存储所有运行时信息的目录。在 Linux 上,此文件位置通常为 $HOME/.local/share/Fuchsia/ffx

此外,任何由 $ 后跟全部大写名称、数字和其他允许的字符组成的字符串都会从进程环境中解析。

数组处理

数组通常用于提供可能值的有序列表,然后返回第一个非空值。

例如,尝试使用环境中的 ssh 密钥,否则回退到标准位置:

{
    "ssh_key": [ "$SSH_KEY_FROM_ENV", "$HOME/.ssh/ssh_key"]
}


## Configuration environment settings

The command collection `ffx config env` is used to manage the configuration
of how to locate the various configuration level data files.

For example, to set the path to the global configuration:

```sh
$ ffx config env set --level global /etc/fuchsia/ffx_global_props.json