將元件分包

套件可以「包含」 子套件 ),產生巢狀結構套件的階層。 元件可以運用子封裝來整理巢狀結構的階層結構 元件,其中每個元件 封裝在其專屬套件中,並引入其專屬依附元件組合。

子套件可讓您:

  • 封裝的依附元件 (封裝的元件會宣告其直接項目) 依附元件)
  • 已隔離的 /pkg 目錄 (已分組的元件不需要合併) 將檔案、程式庫和中繼資料整合到單一共用命名空間中
  • 安全依附元件解析 (系統與建構工具可確保子套件) 一律使用「Travel with」的包裹)

與 Fuchsia 元件的關係

Fuchsia 運用套件「發行」軟體 (例如載入 安裝到裝置上)。以下僅含單一元件且未包含的依附元件: 通常包含在單一套件中啟動其他 元件可以定義套件,並「包含」特定版本 ( 建構時間)。

以這種方式整理時,子套件階層會反映元件 父項-子項關係孩童 接著,系統會從父項的宣告子套件中載入元件 個別元件這會封裝 ABI 位於 套件邊界。

元件也可以使用子套件宣告 非可執行元件 (沒有 program 宣告) 並取得存取權 透過目錄功能傳送至其中的 /pkg 資料。公開套件 做為標準的「目錄功能」,元件會使用 使用功能轉送來限制對特定套件子目錄的存取權。 維護最低權限原則。

套件依附元件鏡像是元件依附元件

Fuchsia 系統是由元件階層組成。我們先用 第一個元件 (階層的根) 元件,元件會為 系統會啟動 children (子元件) 來提供這些功能。 每個元件都有機會啟動各自的元件子樹狀結構。

如要將 child 元件例項化,父項會識別子項的來源 (實作軟體) 使用 「元件網址」(套件網址與內部套件資源位置相結合 元件資訊清單);例如 fuchsia-pkg://fuchsia.com/package#meta/component.cm

重要的是,在元件架構中,「唯一」只能放置一個元件 就是宣告子項時,依據元件網址定義執行階段依附元件。元件 網址無法定義對對等元件或任何其他的依附元件 。

如果子項元件是以絕對元件網址 (例如 fuchsia-pkg://fuchsia.com/package#meta/component.cm,元件開發人員 不會控制該依附元件的實作 或來自臨時來源的執行階段 (套件伺服器)。

子封裝可讓開發人員改為宣告含有以下依附元件的套件依附元件: 建構時間解析,「烘焙」預期的元件實作方式 包括已知 ABI 和行為,同時不影響封裝和 隔離套件邊界的優點這可確保含有 元件依附元件具有密封實作及其行為 如果未重新建構父項元件,子項元件就不會變更 套件。

使用子封裝的元件網址也能避免絕對元件固有的問題 網址:如果從替代存放區載入父項元件 (例如) 例如 fuchsia-pkg://alt-repo.com/package#meta/parent.cm,可能代表 子項可能也位於該 alt-repo,而且無法以靜態方式 定義可從 fuchsia.com 或 0 解析的絕對元件網址 alt-repo.com (或其他) 直到執行階段才知道。

使用相對套件路徑,將實作子套件的子項元件 是以含有子套件名稱 (子套件) 的相對元件網址識別 網址,且具有指定元件資訊清單路徑的 URI 片段,例如 some-child#meta/default.cm。子套件名稱 some-child 的對應現在為 並在建構時間解析,方法是儲存 父項元件套件中繼資料內的子套件套件雜湊值, 子套件名稱。

依附元件為遞移性及封裝

元件軟體實作不會use其他元件。元件 use 功能。元件的功能可能來自父項 (在家長不知情的情況下,由家長直接或間接轉送 元件) 或從子項中移除。重要的是,如果孩子已公開某項能力 也可以是直接或間接子項的實作內容經過封裝 因此,該子項可能會實作所公開的能力 而是直接選擇一位小孩

透過分包包裝,元件可以完全封裝實作、 包括子元件的所有依附元件

當元件使用絕對元件網址宣告子項時, 系統會在執行階段選取該子項的實作。如果是 但缺點是,父項元件 因此,在新的環境中重複使用父項元件並不容易 發行及移植非密封的程式碼時,必須確實追蹤所有 並確保依附元件一律位於 並支援任一新環境

    children: [
        {
            name: "intl_property_provider",
            url: "fuchsia-pkg://fuchsia.com/intl_property_manager#meta/intl_property_manager.cm",
        },
        ...
    ]

在不需要執行階段解析度時,父項元件可以更新其所需的 子項,以便使用相對路徑網址並宣告子項元件包裹 做為子套件依附元件,在建構時解析這樣一來 子套件會成為子元件,子套件會納入其所有子套件 所有元件的內覆性,但不會將這些依附元件 公開給 可能會用到的元件和執行階段環境

    children: [
        {
            name: "intl_property_provider",
            url: "intl_property_manager#meta/intl_property_manager.cm",
        },
        ...
    ]
敬上

無法透過 /pkg 目錄取得環境權威授權

為了支援 Fuchsia 元件的基本執行階段需求, 一個元件可以透過以下方式存取含有其套件內容的目錄: /pkg 目錄能力。

如上所述,組件可讓套件宣告其元件 將依附元件做為階層式的階層式套件套件這個模型 不需要為每個元件提供獨立的套件,但建議使用 Fuchsia 執行階段和工具的設計目的是讓宣告 建構及執行單獨封裝的元件,這是一種自然且高效能。

相反地,如果單一套件中合併的多個元件會共用單一 合併的 /pkg 目錄。在單一套件中加入多個元件 讓每個元件不僅可存取相同資料,也能存取 該套件中的其他元件 轉送。

在某些情況下,多個元件會共用相同資料的存取權, 可能會變得方便但如果元件需要 或單一元件使用的資料不應 其他的包裝元件可能會破壞最低程度的 權限,調整子套件的尺寸。

特定元件可能無法利用 權限比寬鬆更擔憂,因為這有時可能無法 而特殊權限為某個元件帶來意想不到的機會 即可利用其他元件的資料

相較於在單一套件中使用多個元件的優點

目前 Fuchsia 允許單一套件內含多個元件。這個 功能會提前顯示子套件,並提供另一種方式 透過相對網址宣告子元件也就是由 URI 片段 透過元件資訊清單的資源路徑識別元件。A 罩杯 #meta/some-child.cm 格式的元件網址會通知 Fuchsia 元件 解析器,以便從相同的應用程式中載入 some-child 的元件實作 包含父項元件的資訊清單。

內建存取權控管功能,方便您共用套件資源

元件架構有助於強制執行 Fuchsia 的能力存取權控管 要求元件明確宣告其能力需求 同時將任何外部連至外部 IP 位址的父項元件 功能 (包括資源) 或其他子項)。

如果某個元件需要來自另一個元件套件的資源,則 元件架構能力轉送宣告允許來源元件 公開特定子目錄,讓目標元件可以存取 只提供必要項目 且由父項元件明確提供

這項功能支援仰賴其他可能滿足需求的用途 從常見套件存取共用 /pkg 目錄,但不公開 整個 /pkg 目錄。

子套件隔離的 /pkg 目錄與元件架構結合 能力轉送提供 Fuchsia 架構採用一致的方式控管存取權 分享套件資源

變更遞移依附元件以不破壞封裝

將元件依附元件合併至單一套件時,所有元件 共用單一、扁平的命名空間,以及遞移依附元件 包含。

例如,如果單一套件 SP 包含元件 A 和元件 B,但 B 也依附於 C,依相對 URI 片段 (#meta/C.cm)、套件 SP 必須含有 ABC 套件。如果之後修改 B,將 C 取代為兩個 新元件 DESP 套件的定義必須變更為軟體包 ABDE除非為引數,否則會捨棄 C D 和/或 E 也依附於 C

雖然部分建構環境允許元件建構目標宣告 這種做法會增加合併風險 將這些元件的內容納入單一命名空間中如果有元件 的依附元件變更時,新檔案可能會覆寫其他檔案 在該套件中,任何一部份的子樹狀結構中, 以未定義且可能引發災難性的方式進行實作。

子套件會將遞移依附元件封裝於 每個子套件的定義,因此可將 SP 套件替換為套件 A (包含元件 A)「僅」使用子套件 B (包含元件 B)。A 套件不需要其他依附元件。 即使 B 的依附元件變更,也不會變更。

子套件實作是建構時間保證

使用相對 URI 片段元件網址 (例如 #meta/some-child.cm) 的情況是 並不保證 ABI 或父項和子項之間的 API 相容性 「位於相同套件」中的元件因為事實上,它們其實可以 每個套件的不同版本

是否暫時解析套件 (來自套件伺服器)。新版本的 您可在父項元件建立期間重新發布相同的套件 並稍後在需要並載入子項元件時。 子項的導入方式可能與 原始版本的套件。

這並非少見或持續的用途:在元件架構中,元件會使用 (預設為) 只在需要時解析。顯示一個元件 服務「S」服務只會在其他元件實際載入時才載入 需要「S」服務。視程式的商業邏輯而定,S 可能會 先呼叫父項元件為幾分鐘後 (或更長時間) 再呼叫

範例

宣告子套件的建構依附元件

支援 Fuchsia 的建構架構應包括宣告 Fuchsia 套件及其內容。如果同時支援子套件, 套件宣告將直接列出其依附的子套件 遏制。

例如,在 fuchsia.git 中,用於宣告 Fuchsia 套件的 GN 範本 支援兩份選用清單:subpackages 與 (較不常用) renameable_subpackages。你可以擇一提供,也可以同時採用兩者。renameable_ version 可讓您的套件為子套件指派套件名稱 用於根據套件網址或元件網址參照子套件時:

fuchsia_test_package("subpackage-examples") {
  test_components = [ ":subpackage-examples-component" ]
  subpackages = [
    "//examples/components/routing/rust/echo_client",
    ":echo_client_with_subpackaged_server",
    "//src/lib/fuchsia-component-test/realm_builder_server:pkg",
  ]
  renameable_subpackages = [
    {
      name = "my-echo-server"
      package = "//examples/components/routing/rust/echo_server"
    },
  ]
}

subpackages 清單包含 GN fuchsia_package 建構目標的清單。變更者: 子套件名稱 (包含套件用來參照 所參照的子套件所定義 package_name fuchsia_package目標。

您也可以使用以下欄位的 package 變數來宣告子套件目標: renameable_subpackages 清單。renameable_targets 也包含選用屬性 name 變數,用於覆寫子套件的預設名稱。

宣告子套件子項

子套件僅可供其父項套件查看,而該元件位於 套件。因此,子套件名稱不得重複 父項套件。如果兩個子套件目標的名稱相同 (或其他任何子套件目標) 表示,父項可以自由指派專屬的子套件名稱 (透過 例如 GN 中的 renameable_subpackages)。

在 CML 中宣告子封裝子元件時,url 應是 相對的子封裝元件網址,如以下範例所示:

children: [
    {
        name: "echo_server",
        url: "echo_server#meta/default.cm",
    },
],

您也可以在執行階段宣告中參照子封裝子元件。 例如透過 Realm Builder API 宣告子項時。例如:

// Add the server component to the realm, fetched from a subpackage
let echo_server = builder
    .add_child("echo_server", "my-echo-server#meta/default.cm", ChildOptions::new())
    .await
    .unwrap();

// Add the client component to the realm, fetched from a subpackage, using a
// name that is still scoped to the parent package, but the name matches the
// package's top-level name. In `BUILD.gn` the subpackage name defaults to
// the referenced package name, unless an explicit subpackage name is
// declared.
let echo_client = builder
    .add_child("echo_client", "echo_client#meta/default.cm", ChildOptions::new().eager())
    .await
    .unwrap();