使用 config_data() 配置产品专用配置

有时,一个组件在一个仓库中定义,但其数据在另一个仓库中定义。例如,fuchsia.git 定义了一个字体提供程序服务,而 workstation_eng 产品配置(在不同的代码库中定义)定义了哪些字体可用于字体提供程序。

借助 config_data() 模板,开发者可以将文件提供给其他软件包中的组件,而无需直接更改该软件包的内容。

import("//build/config.gni")

config_data("workstation_fonts") {
  for_pkg = "fonts"
  sources = [
    "RobotoMono-Light.ttf",
    "RobotoMono-Medium.ttf",
    "RobotoMono-Regular.ttf",
  ]
  outputs = [ "fonts/{{source_file_part}}" ]
}

在组件中使用 config_data()

在组件清单 (.cml) 文件中添加以下代码:

{
    use: [
        {
            directory: "config-data",
            rights: [ "r*" ],
            path: "/config/data",
        },
    ],
}

在运行时,您的组件将能够读取路径 /config/data 中的配置文件。

为使上述代码正常运行,必须为组件提供 "config-data"。例如,您的父母可能具有如下所示的声明:

{
    children: [
        {
            name: "font-provider",
            url: "fuchsia-pkg://fuchsia.com/fonts#meta/font-provider.cm",
        },
    ],
    offer: [
        {
            directory: "config-data",
            from: "parent",
            to: [ "#font-provider" ],
            subdir: "fonts",
        },
    ],
}

请注意,上面的 for_pkg = ...subdir: ... 已经过协调处理,因为它们设置了相同的值 "fonts"

正在测试 config_data()

在测试领域中受测组件可以将 "config-data" 目录路由到该组件,方式与生产组件大致相同。

如果您希望为被测组件提供不同的配置数据,只需为 for_pkgsubdir 使用适当的值,即可将测试数据路由到测试组件。

config_data() 的运作方式

build 配置中定义的所有 config_data() 目标都会将其文件收集到一个名为 config-data 的软件包中。此软件包在系统程序集中定义为基本软件包集的一部分。此软件包的内容会复制 config_data() 定义中的参数,以便它们可以作为子目录路由到需要使用它们的组件。

已知问题

  • config_data() 定义中收集所有文件的 config-data 软件包是基本软件包的一部分。因此,其内容不会在 fx serve 开发者工作流中更新。如需更新数据文件,您必须重新加载或 OTA 您的设备,或者如果使用模拟器,请重新构建系统映像并重启模拟器。

  • 定义 config_data() 还需要更改组件清单文件,如上所示。使用的某些字符串在多个位置重复,因此容易出错。如果出现错误,就很难进行问题排查。

  • config_data() 目标定义了解应使用此数据的组件的软件包的名称。这样更容易形成脆弱的协定,而这些协定又难以发展,也十分危险。例如,为了让平台为树外组件及其测试提供 ICU 数据,Fuchsia 源代码树中有树外软件包名称的硬编码列表

由于上述问题,建议您尽可能使用其他配置机制