Rust: サンプル プログラムをライブラリ クレートに追加する


最近、私は実際に小さなさびの木枠を公開しようと決心しました.そのために、必要なこととできることのいくつかを調べ始めました.過去に perl モジュールを公開しました.そして、私自身の原則として、モジュールまたはライブラリーを使用するサンプル・プログラムを提供するのが好きです.それが今日私が見るものです.

Rust を学ぶためにこのプロジェクトを始めたとき、私は単純に 1 つのプログラムを作成していました.物事が進化するにつれて、それはより複雑になり、ライブラリを使用するプログラムになりました.これで大丈夫でした.

しかし、これをライブラリクレートにすることを見たとき.ライブラリをコンパイルしたときに、ライブラリが必要としない外部クレートも取り込んでいることに気付きました.なんで?私のクレートはライブラリとバイナリだったからです.

Cargo.toml






[package]
-- snip --
edition = "2018"

[dependencies]
trust-dns-resolver = "0.20.1"
ipnetwork = "0.17.0"
regex = "1"


古い toml ファイルでは、すべての依存関係が一緒にリストされていることがわかります.私のライブラリは実際には ipnetworkregex しか利用していませんが.この時点で、私の正規表現は lazy_static クレートを使用していませんでした.

また、[lib] セクションもリストしていません.

新しい




[lib]
name = "redacted" (at least until I publish it)
path = "src/lib.rs"

[[example]]
name = "trust-dns-demo"
path = "examples/trust-dns-resolver.rs"

[dependencies]
ipnetwork = "0.17.0"
regex = "1"
lazy_static = "1.4.0"

[dev-dependencies]
trust-dns-resolver = "0.20.1"


この新しい toml ファイルで. trust-dns-resolver[dev-dependencies] の下に移動しました.このようにして、ライブラリをコンパイルすると、trust-* クレートとその依存関係はコンパイルされません.これには、ドキュメントの作成時に追加の利点があります.ドキュメントには [dependencies] 未満のアイテムのみが含まれています.

実行することもできますが:

cargo doc --no-deps


これにより、ドキュメントが依存関係のドキュメントを生成できなくなります.

クレートのディレクトリ構造






├── Cargo.lock
├── Cargo.toml
├── LICENSE
├── README.md
└── src
    ├── lib.rs
    ├── main.rs
    └── spf


古いセットアップには main.rs があります.これは事実上、これがバイナリ クレートであることを cargo に伝えます. [lib]Cargo.toml は、ライブラリクレートであることも示しています.
main.rs を持つことの影響は、バイナリとライブラリの両方がコンパイルされることです.私の場合、 main.rstrust-dns-resolver に依存しています.

これをライブラリとしてのみコンパイルし、実行可能なサンプル プログラムも提供するには、example ターゲットを定義します.

上記のとおりです.

[[example]]
name = "trust-dns-demo"
path = "examples/trust-dns-resolver.rs"


これにより、コンパイル可能な新しいターゲットが定義されます.特にThe Cargo Bookからのメモ、
Example州.

Files located under the examples directory are example uses of the functionality provided by the library. When compiled, they are placed in the target/debug/examples directory.

Examples can use the public API of the package's library. They are also linked with the [dependencies] and [dev-dependencies] defined in Cargo.toml.


新しい



.
├── Cargo.lock
├── Cargo.toml
├── LICENSE
├── README.md
├── examples
│   └── trust-dns-resolver.rs
└── src
    ├── lib.rs
    └── spf

ここで行ったことは、examples ディレクトリを作成し、main.rs の名前を変更して、この新しいディレクトリに trust-dns-demo.rs として移動することでした.

結果



ビルドを実行するとき.主な依存関係のみを使用します.

$ cargo build
  Compiling memchr v2.3.4
  Compiling serde v1.0.125
  Compiling regex-syntax v0.6.23
  Compiling lazy_static v1.4.0
  Compiling aho-corasick v0.7.15
  Compiling regex v1.4.6
  Compiling ipnetwork v0.17.0
  Compiling something v0.1.0 (/Users/me/Documents/Development/rust/something/


ただし、テストを実行すると.

cargo test
   Compiling libc v0.2.96
   Compiling cfg-if v1.0.0
   Compiling proc-macro2 v1.0.27
   Compiling unicode-xid v0.2.2
   -- snip 40 items for brevity --
   Compiling idna v0.2.3
   Compiling rand v0.8.3
   Compiling url v2.2.2
   Compiling thiserror-impl v1.0.25
   Compiling enum-as-inner v0.3.3
   Compiling thiserror v1.0.25
   Compiling trust-dns-proto v0.20.3
   Compiling trust-dns-resolver v0.20.3
   Compiling something v0.1.0 (/Users/me/Documents/Development/rust/something)
    Finished test [unoptimized + debuginfo] target(s) in 21.68s
     Running unittests (target/debug/deps/something-49ff56fbf5edcf40)

running 69 tests
test spf::kinds::test_kind_ip4 ... ok
test spf::kinds::test_kind_exists ... ok
test spf::kinds::test_kind_a ... ok
-- Snip 60 items for brevity --
test spf::tests::spf::test_spf::test_redirect ... ok
test spf::tests::spf::test_spf::test_netblocks2_google_com ... ok
test spf::tests::spf::ptr::capture::test_match_on_ptr ... ok
test spf::tests::spf::ptr::parse::test_exist ... ok
test spf::tests::spf::ptr::parse::test_exist_colon ... ok
test spf::tests::spf::ptr::capture::test_match_on_ptr_colon ... ok

test result: ok. 69 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

   Doc-tests something

running 5 tests
test src/spf/mod.rs - spf::Spf::from_str (line 66) ... ok
test src/spf/kinds.rs - spf::kinds::MechanismKind::as_str (line 82) ... ok
test src/spf/mechanism.rs - spf::mechanism::Mechanism<IpNetwork>::raw (line 155) ... ok
test src/spf/mechanism.rs - spf::mechanism::Mechanism<String>::new_a (line 65) ... ok
test src/spf/mechanism.rs - spf::mechanism::Mechanism<IpNetwork>::string (line 171) ... ok

test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.64s


以下が含まれていることに注意してください.

Compiling trust-dns-proto v0.20.3
Compiling trust-dns-resolver v0.20.3


サンプルプログラムを実行する



これは非常に簡単に行うことができます.

$ cargo run --example
error: "--example" takes one argument.
Available examples:
    trust-dns-demo


したがって、単純に実行できます

$ cargo run --example trust-dns-demo
Finished dev [unoptimized + debuginfo] target(s) in 0.21s
 Running `target/debug/examples/trust-dns-demo`
List of TXT records found for gmail.com.
TXT Record 1:
v=spf1 redirect=_spf.google.com
TXT Record 2:
globalsign-smime-dv=CDYX+XFHUw2wml6/Gb8+59BsH31KzUr6c1l2BPvqKX8=

Decontructing SPF Record
Spf { source: "v=spf1 redirect=_spf.google.com", version: "v=spf1", from_src: true, include: None, redirect: Some(Mechanism { kind: Redirect, qualifier: Pass, mechanism: "_spf.google.com" }), is_redirected: true, a: None, mx: None, ip4: None, ip6: None, ptr: None, exists: None, all: None }
SPF1: v=spf1 redirect=_spf.google.com


Is a redirect: true

redirect: _spf.google.com
mechanism: redirect=_spf.google.com


閉鎖



この記事は以上です.あなたの錆ライブラリと一緒にサンプルプログラムを提供するのがかなり理解しやすい方法であることを願っています.