假设我执行cargo new one --bin和cargo new two --bin然后添加相同的依赖于每个项目的Cargo.toml并构建它们.
现在有两组完全相同的库:
/ one/target/debug/deps/*.rlib
/ two/target/debug/deps/*.rlib
它们是相同的文件和浪费的存储空间,但问题是我必须为每个项目再次编译这些库.这需要很长时间.有同样的问题cargo install.
我可以指定存储已编译库的位置以避免重新编译吗?
几个货物项目可能使用相同的目标目录共享库.
在项目中放置一个".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 环境变量.
在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功能将构建重定向到不同的位置,所以我从未尝试过共享构建.但根据这个问题,它应该有效.
即使有办法做到这一点,您可能也不想这样做。仅仅因为您碰巧使用相同的库并不意味着它们的编译方式相同。例如,Cargo 支持 features 的概念,编译时配置会改变 crate 的编译方式。
同样,您可能需要支持 Rust 的多个版本,例如 nightly 和 stable。或者也许您需要针对不同的架构进行交叉编译。每一个都会产生不同的代码。
Cargo会缓存单个项目的构建产品,所以我发现开销并不明显,而且我编译了很多在 Stack Overflow 上提问的人的项目!:-)