解析清单文件失败 - 未指定目标

46

我是Rust的新手,试图使用Cargo构建一个测试项目。我的Cargo.toml看起来像这样:

[package]
name = "rust-play"
version = "0.0.1"
authors = [ "Bradley Wogsland <omitted>" ]

但实际的TOML文件没有省略我的电子邮件。当我运行cargo build时,出现以下错误:

错误:无法解析/Users/wogsland/Projects/rust-play/Cargo.toml中的清单

原因: 清单中未指定目标 必须存在src/lib.rs、src/main.rs、[lib]部分或[[bin]]部分之一

我的main函数在src/test.rs文件中。我需要在TOML文件中指定吗?如果需要,该如何指定?我尝试添加了以下内容:

target = "src/test.rs"

无济于事。

7个回答

61

正如错误所述:

必须存在 src/lib.rssrc/main.rs[lib] 部分或者 [[bin]] 部分

因此,直接的解决方法是添加一个 [[bin]] 部分

[[bin]]
name = "test"
path = "src/test.rs"
然而,通常更常见的做法是将文件放置在预期位置:src/main.rs。如果您计划有多个二进制文件,也可以将其放置在src/bin/test.rs中。
如果实际上是为了测试您的代码,则单元测试与它们测试的代码位于同一文件中,集成测试位于tests/foo.rs中。

谢谢,这非常有帮助! - wogsland
1
我在安装IntelliJ IDEA时遇到了问题,它感到困惑,但这解决了intellij idea错误。 - Felipe Valdes

16

替代问题及解决方案: 如果你将Cargo.toml文件复制到包的父文件夹中,也会遇到此错误。


4
非常感谢,我从未想到过那个方法,解决了我的问题。 - Rodolfo
为什么?这是一个错误吗? - Pavel Šimerda
1
不,这不是一个 bug,cargo 尝试找到项目的根目录。它以这种方式工作,以允许您在工作区的子箱文件夹中运行 cargo 命令。 - DenisKolodin

2
在我的情况和你的情况可能也是一样的,rs文件没有被命名为main.rs,而Cargo则假设src/main.rs是二进制箱的crate root。因此,规则是:如果项目是可执行文件,则将主源文件命名为src/main.rs。如果它是一个库,则将主源文件命名为src/lib.rs
另外,Cargo还会将位于src/bin/*.rs中的任何文件视为可执行文件,就像前面提到的那样。

你能详细说明一下这个答案与其他答案的不同之处吗?另一个答案已经说过“将文件放置在预期位置:src/main.rs”。 - Shepmaster
1
@Shepmaster,感谢您的提问。在我的回答中,我试图明确强调如果有人使用除main.rs以外的任何其他名称但仍将其放置在srs位置,则需要将文件重命名为main.rs。这是您的回答中没有明确提到的内容,必须是main.rs文件而不是其他名称。此外,我认为提及库也很重要。我可以请求撤销负评吗? :) - Wahib Ul Haq

2

在Ubuntu 20.04上,我遇到了这个问题,之前不小心将Cargo.toml复制到了我的主目录中。即使我的工作目录中有一个正确定义的Cargo.toml,但是在$HOME中的副本却优先生效并导致构建失败。


1
作为总结:
如果你使用,你会发现在目录下的文件名为main.rs。当你检查Cargo.toml文件时,它与你编写的相同。所以第一种方法是将src目录中的文件更改为main.rs 根据cargo报告,我们可以使用[[bin]]来设置文件。@Shepmaster已经解决了这个问题。
两种方法都可以工作。

你能解释一下这个答案相对于现有答案提供了什么新信息吗? - Shepmaster
好的,我刚刚发现你的回答已经解释了两种方法。@Shepmaster,实际上,我是新手,遇到了同样的问题,所以当我解决它时,我发布了那个答案。 - Jesse Chen

1

我也遇到了这个问题,原因是上级目录中也有一个Cargo.toml文件,它比当前目录中的优先级更高。


0
我今天确实遇到了这个问题。但这次问题是由于父目录层次结构中某个无效的 cargo.toml 文件引起的。
即使在根目录挂载点上有一个无效的 /cargo.toml 文件,该服务器上的所有构建都将失败。
在这个论坛主题中提出的解决方法https://users.rust-lang.org/t/what-is-the-correlation-between-two-cargo-toml-in-the-file-hierarchy/101933是将 cargo.toml 文件转换为一个独立的工作区,通过在 cargo.toml 文件中添加一个 [workspace] 部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接