使用了CMake之后,我已经习惯了使用CMake鼓励的源代码外构建.如何使用Cargo进行源代码外构建?


再次使用源代码构建感觉像是倒退:

  • 开发工具需要配置为忽略路径.有时会有多个插件和开发工具——尤其是使用VIM或Emacs!
  • 有些工具无法配置为轻松隐藏生成文件.虽然点文件通常是隐藏的,但它们仍然会显示Cargo.locktarget/,更糟糕的是,它们会递归地expose 其内容.
  • Deleting un-tracked files删除版本控制之外的所有内容,通常是清理编辑器临时文件或一些测试输出,如果忘记向版本控制添加新文件,并且在删除它们之前没有正确判断文件列表,则可能会适得其反.
  • 依赖项会下载到源代码路径中,有时会在target目录中添加*.rs个文件,作为构建间接DEP的一部分,因此对所有*.rs个文件进行操作可能会意外地拾取不在隐藏目录中的其他文件,因此即使配置了开发工具,也可能不会被忽略.

虽然可以解决所有这些问题,但我宁愿有一个外部构建路径,并保持源目录的原始状态.

推荐答案

您可以通过configuration file (key build.target-dir)environment variable (CARGO_TARGET_DIR)指定directory of the 102文件夹.以下是使用配置文件的示例:

假设您想要有一个目录~/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/ dir,但是所有的东西都在~/work/my-target/中.


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

最后,在更改target dir时有几个注意事项,如 list in the PR which introduced the feature所示.

Rust相关问答推荐

如何最好地并行化修改同一Rust向量的多个切片的代码?

无法在线程之间安全地发送future (&Q;)&错误

当第二个`let`依赖于第一个`let()`时,如何在一行中有多个`let()`?

S,一般性状和联想型性状有什么不同?

在Rust 中移动原始指针的靶子安全吗

如何创建一个可变的嵌套迭代器?

使用关联类型重写时特征的实现冲突

如何实现Deref;多次;?

这是什么:`impl Trait for T {}`?

详尽的匹配模式绑定

在1.5n次比较中找到整数向量中的最大和次大整数

如何从trait方法返回std :: iter :: Map?

为什么 Rust 的临时值有时有参考性有时没有?

Rust 中 Mutex<> 的深拷贝?

如何在 Rust 中将枚举变体转换为 u8?

在 Rust 中,Weak 如何知道内部值何时被删除?

在构建器模式中捕获 &str 时如何使用生命周期?

哪些特征通过 `Deref` 而哪些不通过?

使用 rust 在 google cloud run (docker) 中访问环境变量的适当方法

有没有更好的方法来为拥有 DIsplay 事物集合的 struct 实现 Display?