有時元件是在一個存放區中定義,但資料是在另一個存放區中定義。舉例來說,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_pkg
和 subdir
值,即可將測試資料路由至測試元件。
config_data()
的運作方式
在建構設定中定義的所有 config_data()
目標,都會將檔案收集到名為 config-data
的單一套件中。這個套件會在系統組合中定義為基本套件集的一部分。這個套件的內容會複製 config_data()
定義中的參數,以便將這些參數做為子目錄路由至需要這些參數的元件。
已知問題
從
config_data()
定義收集所有檔案的config-data
套件,是基本套件組合的一部分。因此,其內容不會在fx serve
開發人員工作流程中更新。如要更新資料檔案,您必須重新鋪設裝置或使用 OTA,如果使用模擬器,則必須重建系統映像檔並重新啟動模擬器。定義
config_data()
時,也必須如上所示變更元件資訊清單檔案。部分字串在多個位置重複出現,容易發生錯誤。發生錯誤時,可能很難排除問題。config_data()
目標定義會知道預期會使用這項資料的元件套件名稱。這會導致難以演進且有風險的脆弱合約。舉例來說,為了讓平台向樹狀結構外元件和相關測試提供 ICU 資料,Fuchsia 來源樹中會存在硬式編碼的樹狀結構外套件名稱清單。
基於上述問題,請盡量使用其他設定機制。