20

ライブラリを作成しようとしていますが、実行時に解析されるデータを持つバイナリ (またはテキスト) ファイルをライブラリに含めたいと考えています。

私の意図は、これらのファイルを制御し、常に更新し、更新ごとにライブラリのバージョンを変更することです。

これは貨物を介して可能ですか?その場合、ライブラリからこれらのファイルにアクセスするにはどうすればよいですか?

私が考えた回避策は、データを保存する.rsような構造体や定数を含むファイルをいくつか含めることです&strが、それはちょっと見苦しいと思います。

編集:

受け入れられた回答を私のケースにより適したものに変更しましたが、これはあなたのケースにより適している可能性があるため、 Shepmaster の回答を見てください。

4

2 に答える 2

19

免責事項:コメントで言及しましたが、詳しく説明するスペースが増えるので、ここで繰り返します.

Shepmaster が言ったように、include_bytes!およびinclude_str!マクロを使用して、Rust ライブラリ/実行可能ファイルにテキストまたはバイナリを逐語的に含めることができます。

しかし、あなたの場合、私はそれを避けます。コンテンツの解析を実行時に延期することにより、次のようになります。

  • 欠陥のあるアーティファクトの構築を許可します。
  • (より多くの) ランタイム オーバーヘッド (解析時間) が発生します。
  • (より多くの) スペースのオーバーヘッド (コードの解析) が発生します。

Rust はこの問題を認識しており、これらの制限を克服するためのコード生成のための複数のメカニズムを提供しています。

  • マクロ: ロジックをマクロにエンコードできる場合は、ソース ファイルに直接含めることができます。
  • プラグイン: 任意のロジックをエンコードして精巧なコードを生成できる強化されたマクロ (「 」を参照regex!)
  • build.rs.rs:ファイルを生成する役割を持つ、適切なコンパイルの前に実行される独立した「Rust スクリプト」

あなたの場合、build.rsスクリプトはぴったりのように聞こえます:

  • 解析コードをそこに移動することで、アーティファクトを軽量化できます
  • 事前に解析することで、より高速なアーティファクトを提供できます
  • 事前に解析することで、正しいアーティファクトを配信します

解析の結果は、有効な Rust コードを生成できるように、関数から静的 (おそらくlazy_static!)まで、さまざまな方法でエンコードできます。build.rs

Cargo Documentationbuild.rsで使用方法を確認できます。Cargo との統合方法とファイルの作成方法 (およびその他) が記載されています。

于 2015-09-24T09:17:47.770 に答える
18

マクロは、include_bytes!あなたが望むものに近いようです。ただし、バイト配列への参照のみを提供するため、それ以降の解析を行う必要があります。

static HOST_FILE: &'static [u8] = include_bytes!("/etc/hosts");

fn main() {
    let host_str = std::str::from_utf8(HOST_FILE).unwrap();

    println!("Hosts are:\n{}", &host_str[..42]);
}

UTF-8 コンテンツがある場合は、 Benjamin Lindleyinclude_str!が指摘したようにを使用できます。

static HOST_FILE: &'static str = include_str!("/etc/hosts");

fn main() {
    println!("Hosts are:\n{}", &HOST_FILE[..42]);
}
于 2015-09-23T20:48:48.753 に答える