工作階段是一般元件,session_manager
可在
啟動。也就是說,建立工作階段元件時
可能與建立其他元件一樣重要本文件探討如何建立
會在啟動時啟動,並顯示「Hello World!」的範例工作階段傳送至系統
。
建立目錄結構
元件需要特定的目錄結構。fx
工具提供了
可為您建立這個結構的產生器該函式會使用
以及要做為引數的語言舉例來說
元件稱為 hello-world-session
,以 Rust 編寫。
執行下列指令,建立這個範例的目錄結構:
fx create component --path hello-world-session --lang rust
這個指令會建立下列目錄結構以及 元件:
hello-world-session
|- meta
| |- hello-world-session.cml
|
|- src
| |- main.rs
|
|- BUILD.gn
建立元件資訊清單
元件資訊清單檔案 (hello-world-session.cml
) 會宣告元件
到 Fuchsia 的體驗。在這個範例中,預設的資訊清單就已足夠,但
立即探索 hello-world-session.cml
提供的下列程式碼:
如有需要,檔案一開始會納入其他 cml 檔案。
include: [ "inspect/client.shard.cml", "syslog/client.shard.cml", ],
這個
include
鍵可讓工作階段元件使用fuchsia.logger.LogSink
能力,以便在系統記錄中列印。接下來是
program
區塊。// Information about the program to run. program: { // Use the built-in ELF runner to run native binaries. runner: "elf", // The binary to run for this component. binary: "bin/hello-world-session", },
program
區塊會告知component_manager
, 工作階段元件runner
鍵會告知component_manager
應該使用 ELF 執行器執行元件二進位檔。最後,元件資訊清單會說明 元件可以是
use
、offer
或expose
。// Capabilities used by this component. use: [ // List your component's dependencies here, ex: // { protocol: "fuchsia.net.name.Lookup" } ], expose: [ // session_manager uses this protocol to start the session. { protocol: "fuchsia.component.Binder", from: "framework", }, ],
在 Rust 中編寫工作階段
您現在可以為工作階段元件編寫實作內容。內部
產生的 src/main.rs
檔案有許多非必要程式碼
在本例中
將 src/main.rs
的內容替換為以下程式碼:
use anyhow::Error;
/// Creates a simple session that just prints "Hello World" to the syslog.
#[fuchsia::main(logging = true)]
async fn main() -> Result<(), Error> {
tracing::info!("Hello World!");
Ok(())
}
這個程式碼會初始化系統記錄,然後顯示「Hello World!」。
tracing::info!
是一個巨集,會輸出層級 info
的記錄檔。
error
和 warn
也有類似的巨集。
寫入 BUILD.gn
最後要修改的檔案是 BUILD.gn
。這會指示編譯器
工作階段元件
Rust 二進位檔
下一節將說明實際的 Rust 二進位檔。會告知編譯器 二進位檔的名稱,應包括單元測試和依附元件 以及其來源的所在位置本例中,預設是 但依附元件就足夠:
rustc_binary("bin") {
edition = "2021"
output_name = "hello-world-session"
# Generates a GN target for unit-tests with the label `bin_test`, and
# a binary named `hello_world_session_bin_test`.
with_unit_tests = true
deps = [
"//src/lib/fuchsia",
"//third_party/rust_crates:anyhow",
"//third_party/rust_crates:tracing",
]
sources = [ "src/main.rs" ]
}
fuchsia_component()
和 fuchsia_package()
範本讓 Fuchsia 更進一步
包括呼叫的元件、取得資訊清單的位置
以及套件和元件有哪些依附元件
fuchsia_component("component") {
component_name = "hello-world-session"
manifest = "meta/hello-world-session.cml"
deps = [ ":bin" ]
}
fuchsia_package("hello-world-session") {
deps = [ ":component" ]
}
識別工作階段網址
session_manager
必須知道要在啟動時啟動哪個工作階段元件,
,只要提供工作階段的元件網址即可。
元件網址須符合下列格式:
fuchsia-pkg://fuchsia.com/package_name#meta/component_name.cm
請注意,路徑會指向 .cm
檔案。.cm
個檔案是編譯版本
執行 fx build
時產生的 .cml
個檔案。在這個例子中
元件網址如下:
fuchsia-pkg://fuchsia.com/hello-world-session#meta/hello-world-session.cm
建構課程
如要建構工作階段 fx set
,必須先用於設定版本,
包含 session_manager
、工作階段元件和工作階段設定
導入基本套件。方法是使用 --with-base
旗標。工作階段
您還必須使用 --args
旗標來設定網址。
fx set core.x64 \
--with-base //src/session/bin/session_manager \
--with-base //path/to/your/session \
--args=product_config.session_url = "fuchsia-pkg://fuchsia.com/<var>package_name</var>#meta/<var>component_name</var>.cm"
如要使用 //src/session/examples
目錄中的範例專案,
fx set
指令如下:
fx set core.x64 \
--with-base //src/session/bin/session_manager \
--with-base //src/session/examples/hello-world-session \
--args=product_config.session_url = "fuchsia-pkg://fuchsia.com/hello-world-session#meta/hello-world-session.cm"
完成後並建構 session_manager
後,應用程式就會自動啟動
工作階段時畫面上應該會顯示「Hello」(您好)訊息。
$ ffx log --filter hello
[session_manager] INFO: Launching session: fuchsia-pkg://fuchsia.com/hello-world-session#meta/hello-world-session.cm
[hello_world_session] INFO: Hello World!