组合结构化配置

结构化配置允许开发者在不同上下文中将具有不同值的组件打包。借助产品组装,开发者可以根据高级平台和产品配置定义结构化配置值。

如需按产品或 build 类型更改组件的配置,您必须声明架构,确定如何从产品的配置派生值,并生成组件的配置。

定义配置架构

组件必须在其清单中声明配置架构。例如:

    ...
    config: {
        enable_foo: { type: "bool" },
    },

如需了解详情,请参阅结构化配置文档

确定产品组装配置

许多配置选项都可以表示为 eng build 和非 eng build 之间的区别。

如果无法仅从 build 类型推导出组件的配置,请向软件汇编列表发送电子邮件,讨论应使用的架构(请注意,此列表可公开查看,请使用 Google 内部列表讨论仅限内部的配置)。确定架构后,将其添加到产品配置库中。

配置软件包

确定您的软件包名称和组件的清单资源路径。定义逻辑,以在产品组装工具中为其填充配置。例如,如需根据 build 类型配置值,请使用以下代码:

use crate::subsystems::prelude::*;
use assembly_config_schema::platform_config::example_config::ExampleConfig;

pub(crate) struct ExampleSubsystemConfig;
impl DefineSubsystemConfiguration<ExampleConfig> for ExampleSubsystemConfig {
    fn define_configuration(
        context: &ConfigurationContext<'_>,
        example_config: &ExampleConfig,
        builder: &mut dyn ConfigurationBuilder,
    ) -> anyhow::Result<()> {
        // If the build-type is eng, enabled "foo" for the example component.
        builder
            .package("configured_by_assembly")
            .component("meta/to_configure.cm")?
            .field("enable_foo", matches!(context.build_type, BuildType::Eng))?;

        if example_config.include_example_aib {
            builder.platform_bundle("example_assembly_bundle");
        }

        Ok(())
    }
}

更新大小限制配置(如果有)

为软件包生成配置值时,产品集必须将其输出写入 build 目录中与构建系统正常生成的路径不同的位置。二进制文件大小检查依赖于 build 目录中存在的软件包清单的路径,因此请务必在 build 配置规则中更新软件包的输出路径。

例如,在让产品组装生成其配置之前,session_manager 软件包已在核心产品的大小限制中列出,如下所示:

{
  component = "Component Framework"
  src = [
    # ...

    "packages/base/session_manager",
  ]

  # ...
},

将 product assembly 用于其配置时,现在必须在大小限制中按如下方式指定 session_manager

{
  component = "Component Framework"
  pkgs = [
    # ...

    "session_manager",
  ]

  # ...
},