依赖于另一个工作区包的二进制文件,该包正在通过Cargo构建。

4

我有一个带有多个包的工作空间项目,其中两个重要的包是:

  • flowc - 既是库又是二进制文件
  • flowstdlib

flowc 是一种编译器,是我在项目中构建的一部分。

flowstdlib 有一个构建脚本,使用 flowc 的二进制文件来构建该包(生成“代码”、文件等),因此在构建 flowstdlib 时需要准备好 flowc 编译器。

flowstdlibcargo.toml 中,我将 flowc 定义为构建依赖项:

[build-dependencies]
flowc = {path = "../flowc", version = "0.31.0" }`

(我尝试将其作为依赖项,但没有变化)

flowstdlibbuild.rs 中,我在路径中查找它,如果在 ../target/debug/flowc 位置找不到:

    let flowc = if Path::new(env!("CARGO_MANIFEST_DIR")).join("../target/debug/flowc").exists() {
        "../target/debug/flowc"
    } else if Simpath::new("PATH").find_type("flowc", FileType::File).is_ok() {
        "flowc"
    } else {
        ""
    };

当我运行构建时,它似乎正在尝试同时并行构建多个软件包:
   Compiling flowstdlib v0.31.0 (/Users/andrew/workspace/flow/flowstdlib)
   Compiling flowsamples v0.31.1 (/Users/andrew/workspace/flow/samples)
warning: Could not find `flowc` in $PATH or `target/debug`, so cannot build flowstdlib
error: failed to run custom build command for `flowsamples v0.31.1 (/Users/andrew/workspace/flow/samples)`

flowstdlib的构建失败是因为flowc二进制文件尚未构建完成。

由于构建过程会继续进行并最终完成flowc的构建,如果重新运行构建,则第二次将成功执行(因为现在可以找到flowc二进制文件)。

因此:

  • 看起来build-dependency确实会等待所依赖的二进制文件被构建完成(也许它会等待库文件被构建完成,很难确定)

问题

如何使flowstdlib的构建等待flowc二进制文件完成? (不强制进行非并行构建)


我认为在Cargo中依赖二进制文件并不容易。你考虑过将flowc的核心逻辑重构为库,并依赖于它吗? - Lambda Fairy
上周刚刚发布了一份RFC,关于向Cargo添加依赖二进制文件的支持:https://github.com/rust-lang/rfcs/pull/3028 - Kevin Reid
flowc已经在库中拥有核心。然后我需要从build.rs中调用它而不调用二进制文件-这样做是可行的,但不是理想的。感谢@LambdaFairy的建议。 - Andrew Mackenzie
谢谢@KevinReid,我会查看那个PR并看看它是否能在合理的时间内完成。 - Andrew Mackenzie
1个回答

3
在RFC落地之前,我的解决方法是将构建分为两条命令(我当前使用Makefile调用它们):
* cargo build -p flowc   # will complete the build of the flowc binary
* cargo build            # will build the entire workspace, including flowstdlib

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