diff --git a/src/cargo/ops/cargo_package.rs b/src/cargo/ops/cargo_package.rs index ab4ceeb4199..c29e5c3ec85 100644 --- a/src/cargo/ops/cargo_package.rs +++ b/src/cargo/ops/cargo_package.rs @@ -207,7 +207,7 @@ fn infer_registry( let reg_name = publish_registry.as_deref().unwrap_or(CRATES_IO_REGISTRY); for pkg in pkgs { if let Some(allowed) = pkg.publish().as_ref() { - if !allowed.iter().any(|a| a == reg_name) { + if !allowed.is_empty() && !allowed.iter().any(|a| a == reg_name) { bail!( "`{}` cannot be packaged.\n\ The registry `{}` is not listed in the `package.publish` value in Cargo.toml.", diff --git a/tests/testsuite/package.rs b/tests/testsuite/package.rs index 92a91d41732..0fbc0f2059c 100644 --- a/tests/testsuite/package.rs +++ b/tests/testsuite/package.rs @@ -2831,6 +2831,69 @@ See https://doc.rust-lang.org/cargo/reference/manifest.html#package-metadata for assert!(p.root().join("target/package/bar-0.0.1.crate").is_file()); } +#[cargo_test] +fn in_workspace_with_publish_false() { + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "foo" + version = "0.0.1" + edition = "2015" + authors = [] + license = "MIT" + description = "foo" + + [workspace] + members = ["no-publish"] + "#, + ) + .file("src/main.rs", "fn main() {}") + .file( + "no-publish/Cargo.toml", + r#" + [package] + name = "no-publish" + version = "0.0.1" + edition = "2015" + authors = [] + license = "MIT" + description = "no-publish" + workspace = ".." + publish = false + "#, + ) + .file("no-publish/src/main.rs", "fn main() {}") + .build(); + + p.cargo("package --workspace") + .with_stderr_data(str![[r#" +[WARNING] manifest has no documentation, homepage or repository. +See https://doc.rust-lang.org/cargo/reference/manifest.html#package-metadata for more info. +[PACKAGING] foo v0.0.1 ([ROOT]/foo) +[PACKAGED] 4 files, [FILE_SIZE]B ([FILE_SIZE]B compressed) +[WARNING] manifest has no documentation, homepage or repository. +See https://doc.rust-lang.org/cargo/reference/manifest.html#package-metadata for more info. +[PACKAGING] no-publish v0.0.1 ([ROOT]/foo/no-publish) +[PACKAGED] 4 files, [FILE_SIZE]B ([FILE_SIZE]B compressed) +[VERIFYING] foo v0.0.1 ([ROOT]/foo) +[COMPILING] foo v0.0.1 ([ROOT]/foo/target/package/foo-0.0.1) +[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s +[VERIFYING] no-publish v0.0.1 ([ROOT]/foo/no-publish) +[COMPILING] no-publish v0.0.1 ([ROOT]/foo/target/package/no-publish-0.0.1) +[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s + +"#]]) + .run(); + + assert!(p.root().join("target/package/foo-0.0.1.crate").is_file()); + assert!(p + .root() + .join("target/package/no-publish-0.0.1.crate") + .is_file()); +} + #[cargo_test] fn workspace_noconflict_readme() { let p = project()