使用 Cargo 进行源代码构建(外部构建目录)?

Out of source builds (external build directory) with Cargo?

使用 CMake 后,我已经习惯了使用 CMake 鼓励的外源构建。如何使用 Cargo 完成源外构建?


再次使用源内构建感觉像是倒退了一步:

虽然可以解决所有这些问题,但我宁愿只使用外部构建路径并保持源目录原始。

您可以通过 configuration file (key build.target-dir) or environment variable (CARGO_TARGET_DIR) 指定 target/ 文件夹的 目录。下面是一个使用配置文件的例子:

假设您想要一个目录 ~/work/,您要在其中保存 Cargo 项目 (~/work/foo/),旁边是目标目录 (~/work/my-target/)。

$ cd ~/work
$ cargo new --bin foo
$ mkdir .cargo
$ $EDITOR .cargo/config

然后将以下内容插入配置文件:

[build]
target-dir = "./my-target"

如果您随后在正常的 Cargo 项目目录中构建:

$ cd foo
$ cargo build

您会注意到没有 target/ 目录,但所有内容都在 ~/work/my-target/.


然而,Cargo.lock 仍然保存在 Cargo 项目目录中,但这是有道理的。 For executables, you should check the Cargo.lock file into your git! For libraries, you shouldn't。我想忽略一个文件总比忽略整个文件夹好。

最后,在 in the PR which introduced the feature.

中列出了更改目标目录的一些注意事项

虽然手动设置不是那么方便,但我希望能够在源代码树中构建多个板条箱,让它们全部脱离源代码,../target-dir 配置选项无法实现。


用于方便的源外构建的辅助实用程序

使用环境变量 I've written a small utility to wrap cargo,因此它会自动构建外源代码,支持顶层和源代码树子目录中的 crate。


感谢 Lukas 指出 CARGO_TARGET_DIRtarget-dir 配置选项。

我真正想要的是动态的CARGO_TARGET_DIR,它会随着我所在的位置而变化。

这个 bash 别名将所有构建放在镜像目录结构中,例如而不是将目标放入 ~/mydir/myproj 而是放入 ~/rustbuild/mydir/myproj

alias cargo='CARGO_TARGET_DIR=$(echo $PWD | sed "s|$HOME|$HOME/rustbuild|g") cargo'

您也可以隐藏 rustbuild 目录。