使用Cargo进行源外编译(外部构建目录)?

22

我曾经使用CMake,对于鼓励使用外部构建的CMake,我已经习惯了它。 那么如何使用Cargo进行外部构建呢?


再次使用内部构建感觉像是退步:

  • 需要配置开发工具以忽略路径。有时候需要使用多个插件和开发工具,特别是在使用VIM或Emacs时。
  • 有些工具无法轻松地隐藏构建文件。虽然点文件通常是隐藏的,但它们仍然会显示 Cargo.locktarget/,更糟糕的是,递归地暴露它们的内容。
  • 删除未跟踪的文件以删除版本控制之外的一切内容,通常是为了清理编辑器临时文件或某些测试输出,如果你忘记将新文件添加到版本控制中并且在删除文件之前没有手动检查文件列表,则可能会出现问题。
  • 依赖项被下载到您的源代码路径中,有时作为构建间接依赖项的一部分,在target目录中添加*.rs文件,因此对所有*.rs文件进行操作可能会意外地捕捉到其他不在隐藏目录中的文件,因此即使配置了开发工具,也可能不会被忽略。

虽然可以解决所有这些问题,但我宁愿有一个外部构建路径并保持源目录清洁。

3个回答

20
你可以通过配置文件(键名为build.target-dir环境变量(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"

如果您随后在常规货物项目目录中构建:

$ cd foo
$ cargo build

你会注意到没有target/目录,而一切都在~/work/my-target/中。


然而,Cargo.lock仍然保存在Cargo项目目录中,这有点合理。对于可执行文件,你应该将Cargo.lock文件提交到git!对于库,不应该这样做。我想只需要忽略一个文件比忽略整个文件夹要好。

最后,更改目标目录有一些注意事项,这些注意事项在引入该功能的PR中列出


3
虽然手动设置很有用,但并不是很方便。我希望能够在一个源树中构建多个箱子,并将它们全部放在源外,而这是“../target-dir”配置选项所无法实现的。

方便的源外构建辅助工具

使用环境变量我编写了一个小型实用程序来包装cargo,因此它会自动进行源外构建,支持在源树的顶层和子目录中构建箱子。


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


1

我真正想要的是一个动态的CARGO_TARGET_DIR,它会根据我的位置变化而改变。

这个bash别名可以将所有的构建放在镜像目录结构中,例如,它不是将目标文件放在~/mydir/myproj中,而是放在~/rustbuild/mydir/myproj中。

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

您可以将rustbuild目录设置为隐藏状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接