設有 config_data() 的產品專屬設定

有時元件是在一個存放區中定義,但資料是在另一個存放區中定義。舉例來說,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()

測試領域中正在測試的元件,可以將 "config-data" 目錄路由至該元件,這與實際工作環境中的元件非常相似。

如果您想在測試中提供不同設定資料的元件,只要使用適當的 for_pkgsubdir 值,即可將測試資料路由至測試元件。

config_data() 的運作方式

在建構設定中定義的所有 config_data() 目標,都會將檔案收集到名為 config-data 的單一套件中。這個套件會在系統組合中定義為基本套件集的一部分。這個套件的內容會複製 config_data() 定義中的參數,以便將這些參數做為子目錄路由至需要這些參數的元件。

已知問題

  • config_data() 定義收集所有檔案的 config-data 套件,是基本套件組合的一部分。因此,其內容不會在 fx serve 開發人員工作流程中更新。如要更新資料檔案,您必須重新鋪設裝置或使用 OTA,如果使用模擬器,則必須重建系統映像檔並重新啟動模擬器。

  • 定義 config_data() 時,也必須如上所示變更元件資訊清單檔案。部分字串在多個位置重複出現,容易發生錯誤。發生錯誤時,可能很難排除問題。

  • config_data() 目標定義會知道預期會使用這項資料的元件套件名稱。這會導致難以演進且有風險的脆弱合約。舉例來說,為了讓平台向樹狀結構外元件和相關測試提供 ICU 資料,Fuchsia 來源樹中會存在硬式編碼的樹狀結構外套件名稱清單

基於上述問題,請盡量使用其他設定機制