2024 Deprecations
Problem
Cargo has been emitting a bunch deprecation message for a (long?) while. Since edition 2024 is approaching (1.82.0 anticipated), and a Cargo linting system is on the way (#13621 ), we might want to take advantage of this timing to evaluate whether this deprecations could be turned into a hard error.
The main risk here is CI automation might fail. Unlike rustc and clippy lints, people hardly noticed Cargo warnings becuase because there was no way to set -D on them.
Deprecations
2024 Edition
These are being tracked in rust-lang/rust#123754
Details
dev_dependencies/build_dependencies/default_features/crate_types/proc_macro
"conflicting between `{new_path}` and `{old_path}` in the `{name}` {kind}.\n
`{old_path}` is ignored and not recommended for use in the future"
Warn since: 1.61 (2022-05-19) but only when conflicting with dash ones
may become a hard error? NO
Risk: Old crates fail to compile. Might need an edition boundary.
Warning on conflicting keys #10316
Next step:
good old [project] (replaced with [package])
"manifest at `{}` contains both `project` and `package`, \
this could become a hard error in the future",
default-features in inherited dependencies
"`default-features` is ignored for {label}, since `default-features` was \
{ws_def_feat} for `workspace.dependencies.{label}`, \
this could become a hard error in the future"
Independent of Edition
Approved changes
Proposed changes
plugin support
"support for rustc plugins has been removed from rustc. \
library `{}` should not specify `plugin = true`",
name_or_panic( lib)
) ) ;
warnings. push ( format ! (
"support for `plugin = true` will be removed from cargo in the future"
dependency without path, version, git, workspace specified
"dependency ({}) specified without \
providing a local path, Git repository, version, or \
workspace dependency to use. This will be considered an \
error in future versions",
name_in_toml
Note:
this affects [dependencies] as well as [patch], [replace], including in virtual workspaces and config where Editions don't apply
hard error makes the format more future proof for adding additional sources (otherwise old cargos would do wildly bad things)
license-file and readme pointing to a non-existent file
"{manifest_key_name} `{}` does not appear to exist{}.\n \
Please update the {manifest_key_name} setting in the manifest at `{}`\n \
This may become a hard error in the future.",
--release is ignored when paired with --profile
"the `--release` flag should not be specified with the `--profile` flag\n \
The `--release` flag will be ignored.\n \
This was historically accepted, but will become an error \
in a future release."
Warn since: 1.57.0 (2021-12-02)
may become a hard error? ✅
Risk: Break people's build. Easy to fix by themselves.
Stabilize named profiles #9943
Next step:
cargo read-manifest
Deprecated, use `<cyan,bold>cargo metadata --no-deps</>` instead.\
Warn since: Merged on 2016-10-03.
Become a hard error? NO
Risk: Automations might still rely on it. cargo metadata --no-deps should cover its use cases.
Document that read_manifest command is deprecated #3150
Next step:
Needs further investigation (unclear why this was deprecated and if it still fills a unique niche)
[replace] is deprecated
> ** Note** : ` [replace] ` is deprecated. You should use the
> [ ` [patch] ` ] ( #the-patch-section ) table instead.
Warn since: 1.42.0 (2020-03-12)
may become a hard error? NO
Risk: Can we patch [patch] to fully replace [repalce]?
Various doc updates #7733
Next step (proposed)
Deprecation warning using lint system (since restricted Carog.toml)
Maybe with future edition turn it into forbid (based on people's reaction to warning)
old cargo tree flags: --all, no-dev-dependencies, --no-indent, --prefix-depth, --all-targets
"The `cargo tree` --all flag has been changed to --no-dedupe, \
and may be removed in a future version.\n \
If you are looking to display all workspace members, use the --workspace flag.",
path override modifying dependency graph
This is currently allowed but is known to produce buggy behavior with spurious
recompiles and changes to the crate graph. Path overrides unfortunately were
never intended to support this feature, so for now this message is just a
warning. In the future, however, this message will become a hard error.
Warn since: Merged on 2016-10-05 (1.14 or so)
may become a hard error? ✅ (was a bug)
Risk: Assuming people seldom use it?
Warn about path overrides that won't work #3136
Next step (proposed):
Turn into error because it was a bug with buggy behavior and people using this went into it knowing its bad (since they likely started post-1.14), and we've not been getting necro-posts for people saying they need this (like depending on bins)
rustc-cdylib-link-arg used in non-cdylib target
"{}{} was specified in the build script of {}, \
but that package does not contain a cdylib target\n \
\n \
Allowing this was an unintended change in the 1.50 \
release, and may become an error in the future. \
For more information, see \
<https://github.com/rust-lang/cargo/issues/9562>.",
user-defined alias is shadowing an external subcommand found
user-defined alias `{}` is shadowing an external subcommand found at: `{}`
This was previously accepted but is being phased out; it will become a hard error in a future release.
For more information, see issue #10049 <https://github.com/rust-lang/cargo/issues/10049>." ,
output artifact name collisions
"Consider changing their names to be unique or compiling them separately.\n \
This may become a hard error in the future; see \
<https://github.com/rust-lang/cargo/issues/6313>.";
Warn since: 1.32.0 (2019-01-17)
may become a hard error? ✅
Risk: Workaround could be quite complicated.
Check for duplicate output filenames. #6308
Next step (proposed):
Maybe in a future Edition, switch to forbid by default?
Or just warn because this is implementation-defined for when a collision may occur and new collisions may come up in the future
Bail out when trying to link to a library that is not linkable
"The package `{}` \
provides no linkable target. The compiler might raise an error while compiling \
`{}`. Consider adding 'dylib' or 'rlib' to key `crate-type` in `{}`'s \
Cargo.toml. This warning might turn into a hard error in the future.",
Ambiguous package name in git dependency
// We can assume a package with publish = false isn't intended to be seen
// by users so we can hide the warning about those since the user is unlikely
// to care about those cases.
if pkg. publish ( ) . is_none ( ) {
let _ = gctx. shell ( ) . warn ( format ! (
"skipping duplicate package `{}` found at `{}`" ,
pkg. name( ) ,
path. display( )
) ) ;
}
No further steps
deprecate --all (alias to --workspace)
flag ( "all" , "Alias for --workspace (deprecated)" )
Warn since: 1.39.0 (2019-11-07)
may become a hard error? NO
Risk: Automations might still rely on it. Some users use it exclusively due to brevity (see also Add short flag -w for --workspace #11554 )
Rename --all to --workspace #7241
Next step (proposed):
CLI, so no further steps
Not doing runtime warning because of pervasive use by people who really like it for brevity
Deprecate .cargo/config
"`{}` is deprecated in favor of `{filename_without_extension}.toml`" ,
possible. display( ) ,
) ) ?;
self . shell ( ) . note (
format ! ( "if you need to support cargo 1.38 or earlier, you can symlink `{filename_without_extension}` to `{filename_without_extension}.toml`" ) ,
2024 Deprecations
Problem
Cargo has been emitting a bunch deprecation message for a (long?) while. Since edition 2024 is approaching (1.82.0 anticipated), and a Cargo linting system is on the way (#13621), we might want to take advantage of this timing to evaluate whether this deprecations could be turned into a hard error.
The main risk here is CI automation might fail. Unlike rustc and clippy lints, people hardly noticed Cargo warnings becuase because there was no way to set
-Don them.Deprecations
2024 Edition
These are being tracked in rust-lang/rust#123754
Details
dev_dependencies/build_dependencies/default_features/crate_types/proc_macrocargo/src/cargo/util/toml/mod.rs
Lines 198 to 199 in f0ae765
good old
[project](replaced with[package])cargo/src/cargo/util/toml/mod.rs
Lines 497 to 498 in f0ae765
[project]within cargo #11135default-featuresin inherited dependenciescargo/src/cargo/util/toml/mod.rs
Lines 1801 to 1803 in f0ae765
default-featurestoTomlWorkspaceDependency#11409Independent of Edition
Approved changes
pluginsupportlib.pluginkey support and make it warning #13902dependency withoutpath,version,git,workspacespecifiedlicense-fileandreadmepointing to a non-existent filelicenceandreadmefiles do not exist into errors #13921--releaseis ignored when paired with--profile--release/debugand--profiletogether becomes an error #13971cargo read-manifestProposed changes
[replace]is deprecatedcargo treeflagsrustc-cdylib-link-argused in non-cdylib targetpluginsupportcargo/src/cargo/util/toml/targets.rs
Lines 211 to 216 in f0ae765
plugin)lib.pluginkey support and make it warning #13902dependency without
path,version,git,workspacespecifiedcargo/src/cargo/util/toml/mod.rs
Lines 1914 to 1918 in 8bcecfe
Note:
[dependencies]as well as[patch],[replace], including in virtual workspaces and config where Editions don't applylicense-fileandreadmepointing to a non-existent filecargo/src/cargo/ops/cargo_package.rs
Lines 416 to 418 in f0ae765
license-file; 1.71.0 (2023-08-03) forreadmecargo packageon emptyreadmeorlicense-filein manifest #12036--releaseis ignored when paired with--profilecargo/src/cargo/util/command_prelude.rs
Lines 570 to 573 in 8bcecfe
cargo read-manifestcargo/src/bin/cargo/commands/read_manifest.rs
Line 9 in 8bcecfe
cargo metadata --no-depsshould cover its use cases.[replace]is deprecatedcargo/src/doc/src/reference/overriding-dependencies.md
Lines 300 to 301 in 8bcecfe
[patch]to fully replace[repalce]?Carog.toml)old
cargo treeflags:--all,no-dev-dependencies,--no-indent,--prefix-depth,--all-targetscargo/src/bin/cargo/commands/tree.rs
Lines 144 to 146 in 8bcecfe
all; NO for otherspath override modifying dependency graph
cargo/src/cargo/core/registry.rs
Lines 535 to 538 in f0ae765
rustc-cdylib-link-argused in non-cdylib targetcargo/src/cargo/core/compiler/custom_build.rs
Lines 850 to 856 in f0ae765
rustc-cdylib-link-argerror to a warning. #9563user-defined alias is shadowing an external subcommand found
cargo/src/bin/cargo/cli.rs
Lines 321 to 323 in f0ae765
cargo clippyandcargo fmtare what we concerned.output artifact name collisions
cargo/src/cargo/core/compiler/build_runner/mod.rs
Lines 472 to 474 in f0ae765
Bail out when trying to link to a library that is not linkable
cargo/src/cargo/core/compiler/mod.rs
Lines 1427 to 1430 in f0ae765
Ambiguous package name in git dependency
cargo/src/cargo/ops/cargo_read_manifest.rs
Lines 225 to 234 in bd1cf58
casefound at~\.cargo\git\checkouts\cargo-..#10752casefound at~\.cargo\git\checkouts\cargo-..#10752No further steps
deprecate
--all(alias to--workspace)cargo/src/cargo/util/command_prelude.rs
Line 54 in 8bcecfe
-wfor--workspace#11554)--allto--workspace#7241Deprecate
.cargo/configcargo/src/cargo/util/context/mod.rs
Lines 1563 to 1567 in 8bcecfe