【问题标题】:Out of source builds (external build directory) with Cargo?使用 Cargo 构建源代码(外部构建目录)?
【发布时间】:2017-05-07 14:13:23
【问题描述】:

使用过 CMake,我已经习惯了使用 CMake 鼓励的外源构建。如何使用 Cargo 进行源外构建?


再次使用 in-source-builds 感觉像是倒退了一步:

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

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

【问题讨论】:

    标签: build rust rust-cargo


    【解决方案1】:

    您可以通过configuration file (key build.target-dir)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

    【讨论】:

      【解决方案2】:

      虽然有用的手动设置并不是那么方便,但我希望能够在源代码树中构建多个 crate,使它们全部脱离源代码,../target-dir 配置选项不会达到。


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

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


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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多