为组件提供数据文件

目标

在关于构建组件的指南中,我们看到了几个为可执行文件定义组件,然后打包这些组件的示例。在本文档中,我们将回顾如何使数据文件可用于同一软件包中的组件。

使用 resource() 的封闭数据文件

在运行时,组件能够通过访问其命名空间中的路径 /pkg/ 来读取其自身软件包的内容。resource() 模板可用于向软件包添加内容,以便以这种方式访问。

import("//build/dist/resource.gni")

# List of greetings
resource("greetings") {
  sources = [ "greetings.txt" ]
  outputs = [ "data/{{source_file_part}}" ]
}

如需了解 {{source_file_part}} 和类似语法,请参阅 GN 占位符

如需了解有关 resource() 模板以及相关模板 resource_group()resource_tree() 的更多使用说明,请参阅 resource.gni

如需查看更多使用 resource()resource_group()resource_tree() 的示例,请参阅其他打包资源

通过组件添加资源

添加对组件中的资源目标的依赖项,以确保资源包含在同一软件包中。

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

# Sends a random greeting to a client
executable("greeter") {
  sources = [ "greeter.cc" ]
  deps = [ ... ]
}

fuchsia_component("greeting_server") {
  deps = [
    ":greeter",
    ":greetings",
  ]
  manifest = "meta/greeting_server.cml"
}

在上面的示例中,组件在运行时可以读取其命名空间中位于 /pkg/data/greetings.txt 路径下的文件。无论此组件包含在哪个/哪些软件包(使用 fuchsia_package() 定义)中,此方法都有效。

包装惯例

  • 小型数据文件(小于 4kb)应打包到 meta/ 下,但这不是必需的。通过将小文件打包到 meta/ 下,打包系统将它们归档到单个 meta.far 文件中,从而更高效地存储小文件。

  • 否则,按照惯例,数据文件通常会按 data/ 打包,但同样不是技术要求。

在不同软件包中使用不同的资源

有时,需要将同一组件与不同的数据文件打包在一起。

import("//build/dist/resource.gni")
import("//build/components.gni")

# Sends a random greeting to a client
executable("greeter") {
  sources = [ "greeter.cc" ]
  deps = [ ... ]
}

fuchsia_component("greeting_server") {
  deps = [ ":greeter" ]
  manifest = "meta/greeting_server.cml"
}

# List of production greetings.
# Contains only the finest greetings and the best regards.
resource("greetings") {
  sources = [ "greetings.txt" ]
  outputs = [ "data/greetings.txt" ]
}

fuchsia_package("greeting") {
  deps = [
    ":greeting_server",
    ":greetings",
  ]
}

# Greetings for testing.
# Contains exactly one greeting so that tests are reproducible.
resource("test_greeting") {
  testonly = true
  sources = [ "test_greeting.txt" ]
  outputs = [ "data/greetings.txt" ]
}

# Connects to the greeting server.
# Ensures that the expected greeting is sent back.
fuchsia_test_component("greeting_test_client") {
  ...
}

fuchsia_test_package("greeting_integration_test") {
  test_components = [ ":greeting_test_client" ]
  deps = [
    ":greeting_server",
    ":test_greeting",
  ]
}

在上面的示例中,将同一 greeting_server 组件添加到了两个软件包中,一个用于生产环境,另一个用于测试。在这两种情况下,组件都会在 /pkg/data/greetings.txt 下找到文件。不过,此文件的内容在正式版和测试版本之间会有所不同,具体取决于软件包关联。