我可以阻止货物在每个新项目中重建图书馆吗?

vla*_*378 9 rust rust-cargo

假设我执行cargo new one --bincargo new two --bin然后添加相同的依赖于每个项目的Cargo.toml并构建它们.

现在有两组完全相同的库:

/ one/target/debug/deps/*.rlib

/ two/target/debug/deps/*.rlib

它们是相同的文件和浪费的存储空间,但问题是我必须为每个项目再次编译这些库.这需要很长时间.有同样的问题cargo install.

我可以指定存储已编译库的位置以避免重新编译吗?

Art*_*mGr 7

几个货物项目可能使用相同的目标目录共享库.

.cargo /配置

在项目中放置一个".cargo"文件夹并在其中创建一个"config"文件,其中包含:

[build]
target-dir = "/path/to/your/shared/target/dir"
Run Code Online (Sandbox Code Playgroud)

在Unix上,这可能看起来像:

mkdir ~/shared_rust_target
mkdir .cargo
echo "[build]" > .cargo/config
echo "target-dir = \"$HOME/shared_rust_target\"" >> .cargo/config
Run Code Online (Sandbox Code Playgroud)

CARGO_TARGET_DIR

设置CARGO_TARGET_DIR 环境变量.

在Unix上,这可能看起来像:

export CARGO_TARGET_DIR = "$HOME/shared_rust_target"
Run Code Online (Sandbox Code Playgroud)

有关其他文档,请参阅此提交target-dir.

特别是,在Cargo 1.9之前,您不应同时将多个项目构建到同一目标目录中.(以下是有关Cargo 1.9如何支持并发构建的更多信息).

target-dir货物文档中也提到了这一点.

请注意,我个人只是使​​用该target-dir功能将构建重定向到不同的位置,所以我从未尝试过共享构建.但根据这个问题,它应该有效.


She*_*ter 3

即使有办法做到这一点,您可能也不想这样做。仅仅因为您碰巧使用相同的库并不意味着它们的编译方式相同。例如,Cargo 支持 features 的概念,编译时配置会改变 crate 的编译方式。

同样,您可能需要支持 Rust 的多个版本,例如 nightly 和 stable。或者也许您需要针对不同的架构进行交叉编译。每一个都会产生不同的代码。

Cargo缓存单个项目的构建产品,所以我发现开销并不明显,而且我编译了很多在 Stack Overflow 上提问的人的项目!:-)

  • 这是一个非常奇怪的不回答。当然,您会希望它缓存内容并冗余地编译世界。它只需要智能地完成,工件必须键入影响构建的所有相关因素。目标、编译器、特性等。这些通常都是相同的。 (4认同)