在Cargo工作区中针对特定的包进行目标设置

5

是否可以有条件地将货物包含在工作空间中,或者告诉Cargo在包的Cargo.toml文件中忽略它们?

假设我有一个带有包的工作空间,应该仅在适当的平台上编译。

[workspace]
members = [
    "main",
    "lib_common",
    "lib_linux_only",
    "lib_macos_only",
]

所有的lib包都是动态库,因此有些包在某些平台上无法构建(因为主可执行文件会在运行时知道加载哪个而不是加载哪个)。但这应该是“静默”的。

在特定于平台的模块中,我有一个条件编译检查,例如

#[cfg(not(target_os = "linux"))]
compile_error!("This feature requires Linux");

那意味着我无法运行主可执行文件,因为平台特定的软件包无法构建。在这种情况下,我必须注释掉在 Mac 上的 Linux 软件包和在 Linux 上的 Mac 软件包。
2个回答

4

目前似乎没有优雅的方法来解决这个问题。请查看这个未解决的issue,以跟踪此功能请求。


请阅读此文章,然后尝试编辑您的问题:https://stackoverflow.com/help/how-to-ask - Peyman Majidi

1

per-package-target

通过不稳定的(截至2023年7月)per-package-target功能,可以设置目标,该包将始终编译为该目标。这里是描述。

不使用Cargo Workspace

一个Reddit上的评论者建议使用单一代码库而不是Cargo Workspaces:

最后,我停止使用工作区,只是在一个单一的代码库中,各个 crate 之间相互依赖。 [...] 你可以通过使用 .cargo/config.toml 强制为特定的 crate 指定特定的目标,但是 Rust Analyzer 假设该工作区中的所有 crate 都使用这个目标,这在将像 web-sys 这样的东西包含在本地或者将 tokio 包含在 wasm 中时会失败。 当使用单一代码库时,你可以通过在 Cargo.toml 中使用相对路径的 path 条目来包含同一代码库中的其他 crate。这确保了这些 crate 之间始终兼容,因为它们有一个共同的提交链。 然后,在 vscode 中,我单独打开每个 crate 作为一个共同的 vscode 工作区的一部分(这与 Cargo 工作区不同!),而不是 git 根目录。这样做是正确的。
除此之外,你可以使用指定特定的依赖项(或者开发依赖项构建依赖项)来实现你所追求的目标。
附注:我刚开始将我的项目变得如此复杂,所以我还没有测试过这些方法。

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