6. staticファイル参照

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!マクロを使用することにします。

1. プロジェクトの作成

$ cargo new icptest --lib
$ cd icptest

2. プロジェクト資材準備

(1) dfx.jsonの作成

1. Hello』と同じdfx.jsonを用意します。

dfx.json

{
  "canisters": {
    "backend": {
      "candid": "./backend.did",
      "package": "icptest",
      "type": "rust"
    }
  },
  "defaults": {
    "build": {
      "args": "",
      "packtool": ""
    }
  },
  "output_env_file": ".env",
  "version": 1
}

(2) didファイルの作成

1. Hello』と同じbackend.didを用意します。

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 (静的ファイル)

こんにちは

(5) プログラム

src/lib.rs

use std::include_str;

const MESSAGE:&str = include_str!("../assets/message.txt"); // "Hello"

#[ic_cdk::query]
fn greet(name: String) -> String {
  format!("{}, {}", MESSAGE, name)
}

3. ビルド & デプロイ

$ dfx start --clean --background
$ dfx deploy

4. 実行

Candid UIを開いて実行してみます。

最終更新