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

时间:2016-05-26 21:33:58

标签: rust rust-cargo

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

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

  

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

     

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

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

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

2 个答案:

答案 0 :(得分:6)

多个Cargo项目可能使用相同的目标目录共享库。

.cargo /配置

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

[build]
target-dir = "/path/to/your/shared/target/dir"

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

mkdir ~/shared_rust_target
mkdir .cargo
echo "[build]" > .cargo/config
echo "target-dir = \"$HOME/shared_rust_target\"" >> .cargo/config

CARGO_TARGET_DIR

设置CARGO_TARGET_DIR environment variable

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

export CARGO_TARGET_DIR = "$HOME/shared_rust_target"

有关额外的target-dir文档,请参阅this commit

特别是,在Cargo 1.9之前,您不应同时将多个项目构建到同一目标目录中。 (Here's more关于Cargo 1.9如何支持并发构建。)

Cargo docs中还提到了{p> target-dir

请注意,我个人只使用target-dir功能将构建重定向到不同的位置,因此我从未尝试过共享构建。但根据this issue,它应该有效。

答案 1 :(得分:4)

即使有办法,你可能也不想这样做。仅仅因为您碰巧使用相同的库并不意味着它们的编译方式相同。例如,Cargo supports the concept of features,编译时间配置,用于更改编译包的方式。

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

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