Backend Canisterにstaticファイルを含めたい場合にどのようにすればよいでしょうか。
FrontendのAsset Canisterでは、htmlファイルやjsファイル、pngファイルなどWebコンテンツに必要なファイルをCanisterへ格納できます。
一方、Backend Canisterの場合は、以下のDfinityサンプルを見た限りでは、Canisterにファイルを直接配置するのではなく、Rustのstd::include_bytes!マクロを使用してビルド時に静的ファイルを取り込んでいるようです。
『1. Hello』で解説したプログラムをベースに、応答文字列のうち「Hello」の部分を静的ファイルから読み込むようにしてみましょう。この例では、ファイルから参照するデータは文字列ですので、std::include_str!マクロを使用することにします。
$ cargo new icptest --lib
$ cd icptest
『1. Hello』と同じdfx.jsonを用意します。
{
"canisters": {
"backend": {
"candid": "./backend.did",
"package": "icptest",
"type": "rust"
}
},
"defaults": {
"build": {
"args": "",
"packtool": ""
}
},
"output_env_file": ".env",
"version": 1
}
『1. Hello』と同じbackend.didを用意します。
service : {
"greet": (text) -> (text) query;
}
(3) Cargo.toml編集
『1. Hello』と同じCargo.tomlを用意します。
[package]
name = "icptest"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib"]
[dependencies]
candid = "0.9.11"
ic-cdk = "0.11.3"
※2023年11月5日時点の最新バージョン
(4) assets/message.txt (静的ファイル)
こんにちは
use std::include_str;
const MESSAGE:&str = include_str!("../assets/message.txt"); // "Hello"
#[ic_cdk::query]
fn greet(name: String) -> String {
format!("{}, {}", MESSAGE, name)
}
$ dfx start --clean --background
$ dfx deploy
Candid UIを開いて実行してみます。