有条件地一次只编译一个模块

ust*_*ion 5 rust

有时重构其中一个模块的更改会影响其他模块(或许多其他模块),因为更改了类型或更改了函数参数等等.在这种情况下,不要改变所有内容然后立即编译有没有办法我可以编译和运行单独的测试只有那个特定的模块,调整到心脏内容,当一切正确改变其他模块等运行完整/正常cargo build/test?当然,其中一种方法可能是在相应的根模块中手动注释/取消注释模块列表,但是有没有其他方式直接来自说cargo test --someflag -only_this_module或什么?

解释更多:

说我有以下几个模块: a, b, c, d, e, f, g, h其中,f仅依靠gh,但其余a, b, c, d, e依赖f(也许gh但这不应该的问题).g并且当然h不依赖于上面的任何事情.因此,如果我进行更改,f我只想编译f并测试它而不更改所有这些.因为f只依赖于我,g并且h我认为如果这些三件事情很好,那么我应该能够测试f即使a, b ... e被打破了,如果我做正常的话,箱子将无法编译cargo build/test.这可能吗.

xam*_*ore 7

在 Rust 中,编译的基本单位是 crate,因此您无法编译 crate 的子集。如何克服:

\n
    \n
  • 将项目切换到货物工作区。您将能够仅构建测试特定的子箱。
  • \n
  • 自顶向下。在根文件中,注释掉所有 \xe2\x80\x9cdownstream\xe2\x80\x9d 模块 ( // mod utils)。编译并测试您正在修改的核心模块。一对一,取消注释下游模块,修复它,然后继续。
  • \n
  • 自下而上。用宏替换核心模块定义todo!()以满足编译器的要求,#[ignore]测试失败,在附近编写新的实现,通过新的定义重新实现旧的定义,迁移其余的代码。
  • \n
  • 复制核心模块及其测试,例如mod utils2. 实验结束后,迁移代码库。
  • \n
  • 遵循座右铭 \xe2\x80\x9c松耦合,紧内聚\xe2\x80\x9d 来排除项目​​中明星的可能性,并从根本上消除原来的问题。
  • \n
  • 使用rust-script执行特定文件:\n
    rust-script --test utils.rs --dep serde\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
\n
\n

支持 Cargo 中单文件包的 RFC 已合并并投入使用!\nRFC 实现后,您可以使用cargo <file>.rs\xe2\x9c\xa8构建并运行 Rust 文件

\n

  • @Hubro这将是一个非常小众的用例,可能不值得(即使你认为它“非常有用”)。一个可能非常困难(如果不是不可能)的技术原因是 Rust 的方法查找规则:本地特征实现可以在板条箱内的任何位置定义,因此可能需要整个板条箱分析来查找实现并编译单个模块。Rust 的模块系统和宏等其他方面使事情变得更加复杂,使得实现这一好处的可能性越来越小。 (3认同)

Vla*_*eev 4

您可以通过将某个模块作为参数提供给测试二进制文件来专门运行该模块的测试。如果您在之后指定,Cargo 会将参数传递给测试二进制文件--,因此类似这样的操作应该有效:

cargo test -- module::you::want::to::test
Run Code Online (Sandbox Code Playgroud)

但是,您不能只编译crate 的一部分。Rust 中的板条箱是编译单元,就像.cC 中的文件一样,你不能编译其中的一半而忽略另一半。