cargo testで「no targets specified in the manifest」エラーが出たときのメモ。
Agenda
現象
作成していたファイル群。
Cargo.toml
[package]
name = "rust"
version = "0.1.0"
edition = "2021"
[dependencies]
borsh = "0.9.1"
borsh-derive = "0.9.1"
src/borsh.rs
use borsh::{BorshSerialize, BorshDeserialize};
#[derive(BorshSerialize, BorshDeserialize, PartialEq, Debug)]
struct A {
x: u64,
y: String,
}
#[test]
fn borsh_test_simple_struct() {
let a = A {
x: 3301,
y: "liber primus".to_string(),
};
let encoded_a = a.try_to_vec().unwrap();
let decoded_a = A::try_from_slice(&encoded_a).unwrap();
assert_eq!(a, decoded_a);
dbg!(a);
dbg!(encoded_a);
dbg!(decoded_a);
}
cargo testを実行するとエラーになる。
% cargo test -- --nocapture
error: failed to parse manifest at `/Users/user/solana-sample/src/rust/Cargo.toml`
Caused by:
no targets specified in the manifest
either src/lib.rs, src/main.rs, a [lib] section, or [[bin]] section must be present
原因
- src/lib.rs または src/main.rs が存在していない。Rustがまずそこを読み込みに行くため。
- もしくは、 Cargo.toml に [lib] セクション または [[bin]] セクションが存在していない
対策
(案1)lib.rsまたはmain.rsの作成
src/lib.rsまたはsrc/main.rsを作成し、そこにソースを記述する。一番手っ取り早い。
(案2)Cargo.tomlにlibまたはbinセクションを追記
以下を追記する。
[lib]
name = "borsh_sample" # The name of the target.
path = "src/borsh.rs" # The source file of the target.
この場合のターミナル実行は以下。
% cargo test -- --nocapture borsh_test_simple_struct
または
[[bin]]
name = "borsh_sample"
path = "src/borsh.rs"
この場合のターミナル実行は以下。なお、libのテスト指定方法はよくわからず。
% cargo test -- --nocapture
(参考)Cargo.tomlの追記イメージ
[package]
name = "rust"
version = "0.1.0"
edition = "2021"
[dependencies]
borsh = "0.9.1"
borsh-derive = "0.9.1"
[lib]
name = "borsh_sample" # The name of the target.
path = "src/borsh.rs" # The source file of the target.
libのnameはRustのライブラリ名とかぶらないように注意すること。