有时,组件是在一个代码库中定义的,但其数据是在另一个代码库中定义的。例如,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()
测试 Realm 中的待测试组件可以将 "config-data"
目录路由到它,方法与生产组件大同小异。
如果您想为测试组件提供不同的配置数据,只需为 for_pkg
和 subdir
使用相应的值,即可将测试数据路由到测试组件。
config_data()
的运作方式
构建配置中定义的所有 config_data()
目标都会将其文件收集到一个名为 config-data
的单个软件包中。此软件包在系统汇编中定义为基础软件包集的一部分。此软件包的内容会复制 config_data()
定义中的参数,以便将它们作为子目录路由到预期接收它们的组件。
已知问题
用于收集
config_data()
定义中的所有文件的config-data
软件包属于基本软件包集。因此,其内容不会在fx serve
开发者工作流中更新。如需更新数据文件,您必须重新铺设或通过 OTA 更新设备;如果使用模拟器,则需要重新构建系统映像并重启模拟器。定义
config_data()
还需要更改组件清单文件,如上所示。使用的部分字符串在多个位置重复,容易出错。一旦出现错误,排查起来可能很困难。config_data()
目标定义知道预计要使用此数据的组件的软件包名称。这会导致难以演变且危险的脆弱协定。例如,为了让平台向外部组件及其测试提供 ICU 数据,Fuchsia 源代码树中存在硬编码的外部软件包名称列表。
鉴于上述问题,请尽可能使用其他配置机制。