設有 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 來源樹狀結構中提供了以硬式編碼方式寫入樹狀結構外套件名稱的清單

基於上述問題,請盡可能採用其他設定機制