目标
在关于构建组件的指南中,我们看到了一些示例, 为可执行文件定义组件并进行打包。本文内容 我们将介绍使数据文件可用于同一软件包中的组件的方法。
包含 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.gni
模板,以及相关模板 resource_group() 和 resource_tree()。
使用 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 下找到一个文件。不过,
在正式版和测试阶段,此文件的内容
版本,具体取决于软件包关联。