如何在工作区中构建特定的软件包?

6

我在我的Cargo项目中有两个包。 Cargo.toml看起来像这样:

[workspace]
members = ["common", "server"]

当我运行cargo build --all时,它会编译所有的软件包。

我只想构建common软件包。如果我执行cd common 并执行 cargo build,它可以正常工作。

但是在根目录下,如果我执行cargo build common,则会出现以下错误:

error: Found argument 'common' which wasn't expected, or isn't valid in this context

USAGE:
    cargo build [OPTIONS]

For more information try --help

能否构建特定的软件包?


1
你的术语概念是反过来的 - commonserver 是工作区内的项目,而不是项目内的工作区。 - Joe Clay
1
@JoeClay 在文档中常用的术语是,工作区 包含多个 或 _箱子_。 - Sven Marnach
4个回答

9
你可以使用 --package-p 标志来运行 cargo build:
cargo build                # build packages listed in the default-members key
cargo build --all          # build all packages
cargo build --package foo  # build the package "foo"
cargo build -p foo         # ditto

2
您可以使用您的子项目中 Cargo.toml 中使用的名称,例如:
# proj1/Cargo.toml
[package]
name = "project-1"

如果你运行:

cargo build -p proj1

你将会得到:

error: package ID specification `proj1` matched no packages

所以不要使用文件夹名称,而要使用包名:
cargo build -p project-1

1
第一个答案无法运行:

error: package ID specification `foo` matched no packages

正确的方法是:

首先找到 pkgid

$ cd server
$ cargo pkgid

file:///dw/path/to/server:4.0.0-SNAPSHOT

前往工作区文件夹并运行build
$ cd -
cargo build -p file:///dw/path/to/server:4.0.0-SNAPSHOT

0
延伸之前提供的答案:使用可以从清单中提取的软件包ID进行构建。例如,我有
#Cargo.toml
[workspace]
members = [
    "crates/fpga",
    "crates/msm",
]

只构建msm时,我会检查此模块/工作区成员的清单。
cargo pkgid --manifest-path crates/msm/Cargo.toml
#file:///home/maya-msm/crates/msm#maya-msm@0.1.0

然后我可以在构建中使用它。
cargo build -p file:///home/maya-msm/crates/msm#maya-msm@0.1.0

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