字型的建構設定包含三個基本層:
背景
要將一組字型放入 Fuchsia 版本,設定方式是 較為困難這是因為
- Fuchsia 的開發人員指南傾向於將預先建構的二進位檔案保存在 CIPD 中 而不是 Git 存放區
- Fuchsia 的字型檔案取自各種來源。
- 在 Fuchsia 系統運作的情況下,僅向客戶提供
目錄中包含 .ttf個檔案。
- 字型中繼資料通常過於冗長、重複且容易出錯。這項服務 最好是為每個常見字型定義一次中繼資料 直接購買這些 Google Cloud 產品, 管理自己的副本
共用基礎架構和中繼資料
第一層會建立資產和中繼資料的目錄 在 Fuchsia 產品版本中使用。
字型資料存放區
字型檔案的外部來源清單會保留在
字型資料存放區。對於 Fuchsia 的開放原始碼字型,您可以在
//fontdata。
每當字型資料存放區內容變更時,Fchsia 的 自動化基礎架構會自動進行檢查, 並將存放區描述的字型檔案 封裝成 CIPD 套件 資料上傳至 Fuchsia 的 CIPD 伺服器。
字型資料存放區包含下列檔案:
manifest.xml
這是 Jiri 資訊清單檔案。 在這個例子中,它是由一份 Git 存放區和修訂版本 ID 的清單組成,其中包含 所需的字型檔案
每個匯入的存放區都會列在 <project> 元素中。
範例項目:
<project
    name="github.com/googlefonts/noto-cjk"
    path="github.com/googlefonts/noto-cjk"
    remote="https://fuchsia.googlesource.com/third_party/github.com/googlefonts/noto-cjk"
    remotebranch="upstream/master"
    revision="be6c059ac1587e556e2412b27f5155c8eb3ddbe6"/>
- name:任意名稱 (不影響任何項目)
- path:決定存放區相對於根層級 結帳目錄。
- remote:遠端存放區的 Git 網址
- remotebranch:遠端存放區中的分支版本名稱
- revision:要固定結帳項目的 Git 修訂版本雜湊
contents.json
以下是 Fuchsia 基礎架構從
將「結帳目錄」複製到暫存目錄。每個 {destination,
files} 項目都會定義暫存目錄中的頂層資料夾和
以便複製到檔案中
範例項目:
{
    "destination": "material",
    "files": [
      "github.com/google/material-design-icons/iconfont/MaterialIcons-Regular.ttf",
      "github.com/google/material-design-icons/LICENSE"
    ]
}
${catalog_name}.font_catalog.json
字型目錄檔案是人工撰寫的一組中繼資料,適用於所有字型 系列、資產和字體。
為方便您編輯,您可以使用 .font_catalog.json 檔案的 JSON 結構定義
於
/src/fonts/tools/schemas/font_catalog.schema.json.
標準結構定義為
在 Rust 中定義。
packing_script.py
Fuchsia 的基礎架構會在填入 暫存檔後叫用這個指令碼 目錄。
指令碼:
- 將暫存目錄的所有字型和授權檔案複製到輸出內容 目錄。
- 系統會在以下位置產生 ${catalog_name}.font_pkgs.json檔案: 輸出目錄
通常不需要修改指令碼。
基礎架構方案
如上所述,每當
fontdata 已經過修改。這份食譜:
- 使用 jiri init和jiri update查看參照的存放區。
- 根據 contents.json分階段結帳的檔案。
- 叫用封裝指令碼,將檔案寫入輸出內容 目錄。
- 將輸出目錄的內容上傳至 CIPD。
CIPD 套件
開放原始碼字型套件會上傳到
fuchsia/third_party/fonts CIPD 套件。
Jiri 預建
他透過 CIPD 套件的內容進入 Fuchsia 結帳流程
prebuilts jiri 資訊清單:
    <!--   Fonts -->
    <package name="fuchsia/third_party/fonts"
             version="git_revision:a10ce51e308f48c5e6d70ab5777434af46a5ddb8"
             path="prebuilt/third_party/fonts"/>
您可以取得 fuchsia/third_party/fonts 套件的 version ID
「標記」最新的執行個體
CIPD 套件頁面。

全域 GN 引數
//src/fonts/build/font_args.gni 宣告
多個字型相關建構引數其中最重要的兩項是
- font_catalog_paths:所有位置- .font_catalog.json檔案。
- font_pkgs_paths:- .font_pkgs.json的所有位置 檔案。
*.font_pkgs.json 個檔案
這類檔案可透過 GN 的簡易 JSON 剖析器剖析,
read_file。
其中包含表單的項目清單
    {
      "file_name": "AlphaSans-Regular.ttf",
      "safe_name": "alphasans-regular-ttf",
      "path_prefix": "alpha"
    },
- file_name:字型檔案素材資源檔案的名稱。這是標準網頁 每個字型資產的識別碼,因此這份對照表中的鍵也是一樣。
- safe_name:檔案名稱的轉換版本:轉換為小寫。 所有特殊字元替換成連字號。這可以用來 Fuchsia 套裝方案。
- path_prefix:資產的父項目錄位置,相對於- //prebuilt/third_party/fonts。
在 //src/fonts/build/fonts.gni 中,
.font_pkgs.json 檔案會合併為單一 GN 範圍
做為對照表。
字型套件
除了直接在字型提供者的命名空間中提供字型素材資源外,
您也可以選擇建立單一字型 Fuchsia 套件這是
顧名思義,package 包含單一字型的
resources 專屬。
這可用於暫時的字型傳送,
fuchsia.pkg.FontResolver。(待辦事項:其他文件的連結)。
所有可能的字型套件都會在
//src/fonts/packages/BUILD.gn。
- 每個套件名稱的格式為 font-package-<font-safe-name>(請參閱safe_name),例如:font-package-roboto-regular-ttf。
- 因此,套件的 GN 目標
//src/fonts/packages:<package-name>,例如//src/fonts/packages:font-package-roboto-regular.ttf。
- 每個套件網址的格式為
fuchsia-pkg://fuchsia.com/<package-name>,例如fuchsia-pkg://fuchsia.com/font-package-roboto-regular-ttf。
local_font_bundle
在 fonts.gni 中定義
本機字型套件是一組直接放置在
字型提供者的命名空間
config_data()。
大部分本機字型套件都會在
//src/fonts/collections/BUILD.gn。
範例:
local_font_bundle("small-open-fonts-local") {
  asset_names = [
    "MaterialIcons-Regular.ttf",
    "Roboto-Regular.ttf",
    "Roboto-Light.ttf",
    "Roboto-Medium.ttf",
    "RobotoMono-Regular.ttf",
    "RobotoSlab-Regular.ttf",
  ]
}
產品專屬字型設定
最後,每 商品目標 就必須使用指定的字型素材資源和 該檔案會包含中繼資料
字型產品設定檔
.fontcfg.json (或 .fontcfg.json5) 檔案包含一組人工撰寫的
產品專屬字型設定另有
JSON 結構定義
提升編輯器使用體驗
這個檔案目前的主要用途是定義特定備用字型 鏈結,亦即當完全符合 用戶端的字體要求無法使用。
這是從 SLI 中
//src/fonts/collections/open-fonts-collection.fontcfg.json5:
fallback_chain: [
        ///
        ///
        /// SANS SERIF LATIN
        "Roboto-Regular.ttf",
        "Roboto-Black.ttf",
        "Roboto-BlackItalic.ttf",
        "Roboto-Bold.ttf",
        "Roboto-BoldItalic.ttf",
        "Roboto-Italic.ttf",
        "Roboto-Light.ttf",
        "Roboto-LightItalic.ttf",
        "Roboto-Medium.ttf",
        "Roboto-MediumItalic.ttf",
        "Roboto-Thin.ttf",
        "Roboto-ThinItalic.ttf",
        "RobotoCondensed-Regular.ttf",
        "RobotoCondensed-Bold.ttf",
        "RobotoCondensed-BoldItalic.ttf",
        "RobotoCondensed-Italic.ttf",
        "RobotoCondensed-Light.ttf",
        "RobotoCondensed-LightItalic.ttf",
        "DroidSans-Regular.ttf",
        "DroidSans-Bold.ttf",
        ///
        ///
        /// SANS-SERIF NON-LATIN
        "NotoNaskhArabicUI-Regular.ttf",
        "NotoSansArmenian-Regular.ttf",
        "NotoSansEthiopic-Regular.ttf",
        "NotoSansGeorgian-Regular.ttf",
        "NotoSansHebrew-Regular.ttf",
        "NotoSansThaiUI-Regular.ttf",
        // All Indian scripts should come after Devanagari, due to shared danda characters.
        "NotoSansDevanagariUI-Regular.ttf",
        "NotoSansBengaliUI-Regular.ttf",
        "NotoSansGujaratiUI-Regular.ttf",
        "NotoSansKannada-Regular.ttf",
        "NotoSansMalayalamUI-Regular.ttf",
        "NotoSansTamilUI-Regular.ttf",
        "NotoSansTelugu-Regular.ttf",
        ///
        ///
        /// SANS SERIF CJK
        {
            full_name: "Noto Sans CJK SC",
        },
        {
            full_name: "Noto Sans CJK TC",
        },
        {
            full_name: "Noto Sans CJK HK",
        },
        {
            full_name: "Noto Sans CJK KR",
        },
        {
            full_name: "Noto Sans CJK JP",
        },
        {
            full_name: "Noto Sans CJK SC Bold",
        },
        {
            full_name: "Noto Sans CJK TC Bold",
        },
        {
            full_name: "Noto Sans CJK HK Bold",
        },
        {
            full_name: "Noto Sans CJK KR Bold",
        },
        {
            full_name: "Noto Sans CJK JP Bold",
        },
        {
            full_name: "Noto Sans CJK SC Black",
        },
        {
            full_name: "Noto Sans CJK TC Black",
        },
        {
            full_name: "Noto Sans CJK HK Black",
        },
        {
            full_name: "Noto Sans CJK KR Black",
        },
        {
            full_name: "Noto Sans CJK JP Black",
        },
        {
            full_name: "Noto Sans CJK SC DemiLight",
        },
        {
            full_name: "Noto Sans CJK TC DemiLight",
        },
        {
            full_name: "Noto Sans CJK HK DemiLight",
        },
        {
            full_name: "Noto Sans CJK KR DemiLight",
        },
        {
            full_name: "Noto Sans CJK JP DemiLight",
        },
        {
            full_name: "Noto Sans CJK SC Light",
        },
        {
            full_name: "Noto Sans CJK TC Light",
        },
        {
            full_name: "Noto Sans CJK HK Light",
        },
        {
            full_name: "Noto Sans CJK KR Light",
        },
        {
            full_name: "Noto Sans CJK JP Light",
        },
        {
            full_name: "Noto Sans CJK SC Medium",
        },
        {
            full_name: "Noto Sans CJK TC Medium",
        },
        {
            full_name: "Noto Sans CJK HK Medium",
        },
        {
            full_name: "Noto Sans CJK KR Medium",
        },
        {
            full_name: "Noto Sans CJK JP Medium",
        },
        {
            full_name: "Noto Sans CJK SC Thin",
        },
        {
            full_name: "Noto Sans CJK TC Thin",
        },
        {
            full_name: "Noto Sans CJK HK Thin",
        },
        {
            full_name: "Noto Sans CJK KR Thin",
        },
        {
            full_name: "Noto Sans CJK JP Thin",
        },
        ///
        ///
        /// SERIF LATIN
        "RobotoSlab-Regular.ttf",
        "RobotoSlab-Bold.ttf",
        "RobotoSlab-Light.ttf",
        "RobotoSlab-Thin.ttf",
        "DroidSerif-Regular.ttf",
        "DroidSerif-Bold.ttf",
        "DroidSerif-BoldItalic.ttf",
        "DroidSerif-Italic.ttf",
        ///
        ///
        /// SERIF CJK
        {
            full_name: "Noto Serif CJK SC",
        },
        {
            full_name: "Noto Serif CJK TC",
        },
        {
            full_name: "Noto Serif CJK KR",
        },
        {
            full_name: "Noto Serif CJK JP",
        },
        {
            full_name: "Noto Serif CJK SC Bold",
        },
        {
            full_name: "Noto Serif CJK TC Bold",
        },
        {
            full_name: "Noto Serif CJK KR Bold",
        },
        {
            full_name: "Noto Serif CJK JP Bold",
        },
        {
            full_name: "Noto Serif CJK SC Black",
        },
        {
            full_name: "Noto Serif CJK TC Black",
        },
        {
            full_name: "Noto Serif CJK KR Black",
        },
        {
            full_name: "Noto Serif CJK JP Black",
        },
        {
            full_name: "Noto Serif CJK SC ExtraLight",
        },
        {
            full_name: "Noto Serif CJK TC ExtraLight",
        },
        {
            full_name: "Noto Serif CJK KR ExtraLight",
        },
        {
            full_name: "Noto Serif CJK JP ExtraLight",
        },
        {
            full_name: "Noto Serif CJK SC Light",
        },
        {
            full_name: "Noto Serif CJK TC Light",
        },
        {
            full_name: "Noto Serif CJK KR Light",
        },
        {
            full_name: "Noto Serif CJK JP Light",
        },
        {
            full_name: "Noto Serif CJK SC Medium",
        },
        {
            full_name: "Noto Serif CJK TC Medium",
        },
        {
            full_name: "Noto Serif CJK KR Medium",
        },
        {
            full_name: "Noto Serif CJK JP Medium",
        },
        {
            full_name: "Noto Serif CJK SC SemiBold",
        },
        {
            full_name: "Noto Serif CJK TC SemiBold",
        },
        {
            full_name: "Noto Serif CJK KR SemiBold",
        },
        {
            full_name: "Noto Serif CJK JP SemiBold",
        },
        ///
        ///
        /// MONOSPACE LATIN
        "RobotoMono-Bold.ttf",
        "RobotoMono-BoldItalic.ttf",
        "RobotoMono-Italic.ttf",
        "RobotoMono-Light.ttf",
        "RobotoMono-LightItalic.ttf",
        "RobotoMono-Regular.ttf",
        "RobotoMono-Medium.ttf",
        "RobotoMono-MediumItalic.ttf",
        "RobotoMono-Thin.ttf",
        "RobotoMono-ThinItalic.ttf",
        "DroidSansMono-Regular.ttf",
        ///
        ///
        /// MONOSPACE CJK
        {
            full_name: "Noto Sans Mono CJK SC",
        },
        {
            full_name: "Noto Sans Mono CJK TC",
        },
        {
            full_name: "Noto Sans Mono CJK HK",
        },
        {
            full_name: "Noto Sans Mono CJK KR",
        },
        {
            full_name: "Noto Sans Mono CJK JP",
        },
        {
            full_name: "Noto Sans Mono CJK SC Bold",
        },
        {
            full_name: "Noto Sans Mono CJK TC Bold",
        },
        {
            full_name: "Noto Sans Mono CJK HK Bold",
        },
        {
            full_name: "Noto Sans Mono CJK KR Bold",
        },
        {
            full_name: "Noto Sans Mono CJK JP Bold",
        },
        ///
        ///
        /// CURSIVE LATIN
        "Quintessential-Regular.ttf",
        ///
        ///
        /// EMOJI
        "NotoColorEmoji.ttf",
        ///
        ///
        /// SYMBOLS
        "NotoSansSymbols-Regular.ttf",
        "NotoSansSymbols2-Regular.ttf",
    ]
如果素材資源檔案包含多個字體, ,而不只是檔案名稱:
fallback_chain: [
    "SomeCompleteFont-Bold.ttf",
    { file_name: "NotoSansCJK-Regular.ttc", index: 1},
]
您必須手動定義備用鏈。請務必遵守以下規範:
- 為每個支援的指令碼至少加入一種字型。(支援一組 各產品適用的指令碼)。
- 試著至少使用 sans-serif、serif和monospace的字型 家庭成員。
- 重疊涵蓋率時,將較明確的素材資源放在 請參考閱讀清單,進一步瞭解 如何選擇 Kubeflow Pipelines SDK 或 TFX舉例來說,所有 Noto Sans 指令碼專用字型都有字符 的 ASCII 範圍,但 Noto Sans Latin 變體應優先顯示。
- 覆蓋範圍重疊時,請將較小的字型檔案放在 請參考閱讀清單,進一步瞭解 如何選擇 Kubeflow Pipelines SDK 或 TFX這可減少載入備用字型時的 UI 卡頓情形。
font_collection
在 fonts.gni 中定義
在使用任何所需的 local_font_bundle 和/或字型 packages 之後
則組合成 font_collection
輸入
(如需完整說明文件,請參閱 Font.gni。)
- font_packages:字型- package的 GN 標籤 在目標產品的- universe_package_labels中。
- local_font_bundles:目標的 GN 標籤 (- local_font_bundle) 產品。這些名稱將包含在字型供應程式的設定資料中。
- local_asset_names:本機字型素材資源名稱清單 (視需要建立- local_font_bundle)。
- product_config_path:包含以下項目的 JSON 檔案路徑 產品專屬字型設定,包括備用 鏈結。
- manifest_prefix:產生的字型資訊清單檔案名稱前置字串。 預設為- "all"。
內部原理
font_collection 掃遍所有字型素材資源和
該 Pod 建立的所有套件收集 GN
中繼資料
建立對應至本機檔案中字型套件的字型清單。
範本會將這些資訊傳遞至字型資訊清單產生器 (GN 範本, Rust source),以及 字型目錄和所有字型素材資源。
資訊清單產生器會從預先定義的中繼資料的字型目錄中選取
font_collection 中的字型檔案。此網路也會讀取
每個已加入的字型檔案
每個字型檔案支援的碼點 (字元集)。
所有資料都會組合成一個 .font_manifest.json 檔案,
以 config_data 規則提供給字型提供者服務。
輸出內容
font_collection 會產生下列構件:
- <manifest-prefix>.font_manifest.json:這是中繼資料的組合 相同。將使用- config_data規則。
- font_packages.json。這個檔案列出所有包含單一字型的 Fuchsia 套件,並使用- config_data規則提供給- pkg-resolver。這個 可決定透過- fuchsia.pkg.FontResolver公開的字型套件。
由 font_collection 建立的 GN 目標會包含 config_data 的
兩個 JSON 檔案,以及本機字型資產的 config_data 目標。
如果產品只使用 local 字型,只需加入
font_collection 目標設為產品依附元件標籤 (通常為
base_package_labels)。
如果產品也會使用字型 package,您必須明確新增這些目標
至
base_package_labels 或
universe_package_labels,
具體取決於套件是否為臨時套件