Skip to content

Warn about path overrides that won't work#3136

Merged
bors merged 1 commit into
rust-lang:masterfrom
alexcrichton:warn-bad-override
Oct 6, 2016
Merged

Warn about path overrides that won't work#3136
bors merged 1 commit into
rust-lang:masterfrom
alexcrichton:warn-bad-override

Conversation

@alexcrichton

Copy link
Copy Markdown
Member

Cargo has a long-standing bug in path overrides where they will cause spurious
rebuilds of crates in the crate graph. This can be very difficult to diagnose
and be incredibly frustrating as well. Unfortunately, though, it's behavior that
fundamentally can't be fixed in Cargo.

The crux of the problem happens when a path replacement changes something
about the list of dependencies of the crate that it's replacing. This alteration
to the list of dependencies cannot be tracked by Cargo as the lock file was
previously emitted. In the best case this ends up causing random recompiles. In
the worst case it cause infinite registry updates that always result in
recompiles.

A solution to this intention, changing the dependency graph of an overridden
dependency, was implemented with the [replace] feature in Cargo awhile back.
With that in mind, this commit implements a warning whenever a bad dependency
replacement is detected. The message here is pretty wordy, but it's intended to
convey that you should switch to using [replace] for a more robust
impelmentation, and it can also give security to anyone using path overrides
that if they get past this warning everything should work as intended.

Closes #2041

Cargo has a long-standing [bug] in path overrides where they will cause spurious
rebuilds of crates in the crate graph. This can be very difficult to diagnose
and be incredibly frustrating as well. Unfortunately, though, it's behavior that
fundamentally can't be fixed in Cargo.

The crux of the problem happens when a `path` replacement changes something
about the list of dependencies of the crate that it's replacing. This alteration
to the list of dependencies *cannot be tracked by Cargo* as the lock file was
previously emitted. In the best case this ends up causing random recompiles. In
the worst case it cause infinite registry updates that always result in
recompiles.

A solution to this intention, changing the dependency graph of an overridden
dependency, was [implemented] with the `[replace]` feature in Cargo awhile back.
With that in mind, this commit implements a *warning* whenever a bad dependency
replacement is detected. The message here is pretty wordy, but it's intended to
convey that you should switch to using `[replace]` for a more robust
impelmentation, and it can also give security to anyone using `path` overrides
that if they get past this warning everything should work as intended.

[bug]: rust-lang#2041
[implemented]: http://doc.crates.io/specifying-dependencies.html#overriding-dependencies

Closes rust-lang#2041
@rust-highfive

Copy link
Copy Markdown

@alexcrichton: no appropriate reviewer found, use r? to override

@alexcrichton

Copy link
Copy Markdown
Member Author

r? @brson


To change the dependency graph via an override it's recommended to use the
`[replace]` feature of Cargo instead of the path override feature. This is
documented online at the url below for more information.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure [replace] handles all the secenarios that path overrides do. In particular, Servo and Gecko seem to get hit by some of the version constraints around [replace] that AFAIK do not exist for path.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@larsbergstrom if that's the case then that's definitely a bug in [replace], are there open issues for this?

Additionally paths isn't going away, this is just warning about a case where it will never work (e.g. you replace with something that changed dependencies)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aha, great! That sounds fine, then :-)

We have open issues (e.g., #2649), but I think that's more of a separate discussion than something that should derail this PR!

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also feel free to ping me periodically about those kinds of issues if they keep coming up, it's good to always confirm or deny initial assumptions!

@brson

brson commented Oct 5, 2016

Copy link
Copy Markdown
Contributor

@bors r+

@bors

bors commented Oct 5, 2016

Copy link
Copy Markdown
Contributor

📌 Commit fc0e642 has been approved by brson

@bors

bors commented Oct 6, 2016

Copy link
Copy Markdown
Contributor

⌛ Testing commit fc0e642 with merge a713da1...

bors added a commit that referenced this pull request Oct 6, 2016
Warn about path overrides that won't work

Cargo has a long-standing [bug] in path overrides where they will cause spurious
rebuilds of crates in the crate graph. This can be very difficult to diagnose
and be incredibly frustrating as well. Unfortunately, though, it's behavior that
fundamentally can't be fixed in Cargo.

The crux of the problem happens when a `path` replacement changes something
about the list of dependencies of the crate that it's replacing. This alteration
to the list of dependencies *cannot be tracked by Cargo* as the lock file was
previously emitted. In the best case this ends up causing random recompiles. In
the worst case it cause infinite registry updates that always result in
recompiles.

A solution to this intention, changing the dependency graph of an overridden
dependency, was [implemented] with the `[replace]` feature in Cargo awhile back.
With that in mind, this commit implements a *warning* whenever a bad dependency
replacement is detected. The message here is pretty wordy, but it's intended to
convey that you should switch to using `[replace]` for a more robust
impelmentation, and it can also give security to anyone using `path` overrides
that if they get past this warning everything should work as intended.

[bug]: #2041
[implemented]: http://doc.crates.io/specifying-dependencies.html#overriding-dependencies

Closes #2041
@bors

bors commented Oct 6, 2016

Copy link
Copy Markdown
Contributor

☀️ Test successful - cargo-cross-linux, cargo-linux-32, cargo-linux-64, cargo-mac-32, cargo-mac-64, cargo-win-gnu-32, cargo-win-gnu-64, cargo-win-msvc-32, cargo-win-msvc-64
Approved by: brson
Pushing a713da1 to master...

@bors bors merged commit fc0e642 into rust-lang:master Oct 6, 2016
@bors bors mentioned this pull request Oct 6, 2016
@alexcrichton alexcrichton deleted the warn-bad-override branch October 6, 2016 18:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Spurious rebuilds of paths-overrides

6 participants