套件可以「包含」 子套件 ),產生巢狀結構套件的階層。 元件可以運用子封裝來整理巢狀結構的階層結構 元件,其中每個元件 封裝在其專屬套件中,並引入其專屬依附元件組合。
子套件可讓您:
- 封裝的依附元件 (封裝的元件會宣告其直接項目) 依附元件)
- 已隔離的
/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
必須含有 A
、B
和 C
套件。如果之後修改 B
,將 C
取代為兩個
新元件 D
和 E
,SP
套件的定義必須變更為軟體包
A
、B
、D
和 E
,除非為引數,否則會捨棄 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();