為元件提供資料檔案

目標

建構元件指南中,我們看過幾個範例,瞭解如何定義執行檔的元件並進行封裝。在本文件中,我們探討如何將資料檔案提供給同一套件中的元件使用。

含有 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() 定義) 為何,這都能正常運作。

包裝慣例

  • 小型資料檔案 (小於 4 KB) 應封裝在 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 底下找到檔案。不過,這個檔案的內容會因套件關聯,在正式版和測試版中而有所不同。