Rust: サンプル プログラムをライブラリ クレートに追加する
最近、私は実際に小さなさびの木枠を公開しようと決心しました.そのために、必要なこととできることのいくつかを調べ始めました.過去に perl モジュールを公開しました.そして、私自身の原則として、モジュールまたはライブラリーを使用するサンプル・プログラムを提供するのが好きです.それが今日私が見るものです.
Rust を学ぶためにこのプロジェクトを始めたとき、私は単純に 1 つのプログラムを作成していました.物事が進化するにつれて、それはより複雑になり、ライブラリを使用するプログラムになりました.これで大丈夫でした.
しかし、これをライブラリクレートにすることを見たとき.ライブラリをコンパイルしたときに、ライブラリが必要としない外部クレートも取り込んでいることに気付きました.なんで?私のクレートはライブラリとバイナリだったからです.
古い toml ファイルでは、すべての依存関係が一緒にリストされていることがわかります.私のライブラリは実際には
また、
この新しい toml ファイルで.
実行することもできますが:
これにより、ドキュメントが依存関係のドキュメントを生成できなくなります.
古いセットアップには
これをライブラリとしてのみコンパイルし、実行可能なサンプル プログラムも提供するには、
上記のとおりです.
これにより、コンパイル可能な新しいターゲットが定義されます.特にThe Cargo Bookからのメモ、
Example州.
ここで行ったことは、
ビルドを実行するとき.主な依存関係のみを使用します.
ただし、テストを実行すると.
以下が含まれていることに注意してください.
これは非常に簡単に行うことができます.
したがって、単純に実行できます
この記事は以上です.あなたの錆ライブラリと一緒にサンプルプログラムを提供するのがかなり理解しやすい方法であることを願っています.
Rust を学ぶためにこのプロジェクトを始めたとき、私は単純に 1 つのプログラムを作成していました.物事が進化するにつれて、それはより複雑になり、ライブラリを使用するプログラムになりました.これで大丈夫でした.
しかし、これをライブラリクレートにすることを見たとき.ライブラリをコンパイルしたときに、ライブラリが必要としない外部クレートも取り込んでいることに気付きました.なんで?私のクレートはライブラリとバイナリだったからです.
Cargo.toml
年
[package]
-- snip --
edition = "2018"
[dependencies]
trust-dns-resolver = "0.20.1"
ipnetwork = "0.17.0"
regex = "1"
古い toml ファイルでは、すべての依存関係が一緒にリストされていることがわかります.私のライブラリは実際には
ipnetwork
と regex
しか利用していませんが.この時点で、私の正規表現は 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.rs
は trust-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
閉鎖
この記事は以上です.あなたの錆ライブラリと一緒にサンプルプログラムを提供するのがかなり理解しやすい方法であることを願っています.
Reference
この問題について(Rust: サンプル プログラムをライブラリ クレートに追加する), 我々は、より多くの情報をここで見つけました https://dev.to/basman/rust-add-an-example-program-to-your-library-crate-jnlテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol