rust-lang / cargo

The Rust package manager
https://doc.rust-lang.org/cargo
Apache License 2.0
12.76k stars 2.42k forks source link

Publish fails when exluding files referenced by cargo targets using a default path #10182

Open daxpedda opened 2 years ago

daxpedda commented 2 years ago

Problem

When using package.exclude or package.include (which will exclude everything not included) on a file that is referenced by a Cargo target with a default path (not specifying a path), cargo publish will fail.

Steps

  1. Initialize an empty crate with the following Cargo.toml file:
    
    [package]
    name = "test-publish-target"
    version = "0.0.0"
    edition = "2021"
    exclude = ["tests"]

[[test]] name = "test" test = false

2. Run `cargo publish --dry-run`

### Possible Solution(s)

Specifying a path solves the problem:
```toml
[[test]]
name = "test"
path = "tests/test.rs"
test = false

Notes

This was also reported here: https://users.rust-lang.org/t/cargo-publish-with-excluded-benchmark-fails-validation/53444. But I didn't find a corresponding issue report.

Version

cargo 1.57.0 (b2e52d7ca 2021-10-21)
release: 1.57.0
commit-hash: b2e52d7cab0a286ee9fcc0c17510b1e72fcb53eb
commit-date: 2021-10-21
host: x86_64-apple-darwin
libgit2: 1.3.0 (sys:0.13.23 vendored)
libcurl: 7.77.0 (sys:0.4.49+curl-7.79.1 system ssl:(SecureTransport) LibreSSL/2.8.3)
os: Mac OS 12.0.1 [64-bit]
weihanglo commented 2 years ago

This should be improved by #10090, which provides a better error message. For example,

error: failed to verify package tarball

Caused by:
  failed to parse manifest at `/projects/issue10182/target/package/issue10182-0.1.0/Cargo.toml`

Caused by:
-  can't find `test` test, specify test.path
+  can't find `test` test at `tests/test.rs` or `tests/test/main.rs`. Please specify test.path if you want to use a non-default path.

We may check all paths of possible Cargo targets (either specified or unspecified) against exclude/include fields. We could share the ignore logic from cargo::core::path::PathSource to cargo::util::toml::targets. Then use the same ignore rule to suppress targets that are excluded.

Alternatively, we can craft a specialized message for missing file of a Cargo target for cargo package, telling that this may be due to file being excluded.

Both of the solution seem a bit overkill to me personally from Cargo implementation side.