使用 Cargo 进行源代码构建(外部构建目录)?
Out of source builds (external build directory) with Cargo?
使用 CMake 后,我已经习惯了使用 CMake 鼓励的外源构建。如何使用 Cargo 完成源外构建?
再次使用源内构建感觉像是倒退了一步:
- 开发工具需要配置为忽略路径。有时多个插件和开发工具 - 特别是使用 VIM 或 Emacs!
- 某些工具无法配置为轻松隐藏生成文件。虽然点文件通常是隐藏的,但它们仍会显示
Cargo.lock
和 target/
,更糟糕的是,递归地暴露它们的内容。
- Deleting un-tracked files 删除版本控制之外的所有内容,通常是清理编辑器临时文件或一些测试输出,如果您忘记将新文件添加到版本控制并且没有 手动在删除文件之前正确检查文件列表。
- 依赖项被下载到您的源代码路径中,有时会在
target
目录中添加 *.rs
文件作为构建间接依赖项的一部分,因此对所有 *.rs
文件进行操作可能会意外拾取其他不在隐藏目录中的文件,因此即使在配置开发工具后也可能不会被忽略。
虽然可以解决所有这些问题,但我宁愿只使用外部构建路径并保持源目录原始。
您可以通过 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。我想忽略一个文件总比忽略整个文件夹好。
中列出了更改目标目录的一些注意事项
虽然手动设置不是那么方便,但我希望能够在源代码树中构建多个板条箱,让它们全部脱离源代码,../target-dir
配置选项无法实现。
用于方便的源外构建的辅助实用程序
使用环境变量 I've written a small utility to wrap cargo,因此它会自动构建外源代码,支持顶层和源代码树子目录中的 crate。
感谢 Lukas 指出 CARGO_TARGET_DIR
和 target-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 目录。
使用 CMake 后,我已经习惯了使用 CMake 鼓励的外源构建。如何使用 Cargo 完成源外构建?
再次使用源内构建感觉像是倒退了一步:
- 开发工具需要配置为忽略路径。有时多个插件和开发工具 - 特别是使用 VIM 或 Emacs!
- 某些工具无法配置为轻松隐藏生成文件。虽然点文件通常是隐藏的,但它们仍会显示
Cargo.lock
和target/
,更糟糕的是,递归地暴露它们的内容。 - Deleting un-tracked files 删除版本控制之外的所有内容,通常是清理编辑器临时文件或一些测试输出,如果您忘记将新文件添加到版本控制并且没有 手动在删除文件之前正确检查文件列表。
- 依赖项被下载到您的源代码路径中,有时会在
target
目录中添加*.rs
文件作为构建间接依赖项的一部分,因此对所有*.rs
文件进行操作可能会意外拾取其他不在隐藏目录中的文件,因此即使在配置开发工具后也可能不会被忽略。
虽然可以解决所有这些问题,但我宁愿只使用外部构建路径并保持源目录原始。
您可以通过 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。我想忽略一个文件总比忽略整个文件夹好。
虽然手动设置不是那么方便,但我希望能够在源代码树中构建多个板条箱,让它们全部脱离源代码,../target-dir
配置选项无法实现。
用于方便的源外构建的辅助实用程序
使用环境变量 I've written a small utility to wrap cargo,因此它会自动构建外源代码,支持顶层和源代码树子目录中的 crate。
感谢 Lukas 指出 CARGO_TARGET_DIR
和 target-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 目录。