LukeMathWalker / cargo-chef

A cargo-subcommand to speed up Rust Docker builds using Docker layer caching.
Apache License 2.0
1.72k stars 113 forks source link

use the manifest path instead of just the member name when using `prepare --bin` #255

Closed ClementTsang closed 6 months ago

ClementTsang commented 7 months ago

Issue #, if available:

Closes: #232

Description of changes:

The current code assumes that when running prepare with --bin, that we can remove all members and just add one member that is equal to whatever we passed in --bin.

The problem with that is that if your packages aren't in the exact same root directory, then this will result in a recipe file that breaks once you try calling cook on it.

To fix this, this PR instead sets the sole member to the path of the package, which (I think) can be found using in cargo_metadata::Metadata, grabbing the manifest path, and setting it to be relative to the workspace root + removing Cargo.toml from the path. I chose to do it this way rather than just matching + grabbing whatever's in the members array as I don't think that would work due to wildcards being valid.

This also adds a test emulating various package locations in a workspace and seeing if the path is correctly set. This previously failed, but now passes with these changes. All other previously-existing tests seem to pass, so I don't believe this should break things. That said, if people were using the workaround mentioned in #232, then I believe this will be a breaking change, so that'll probably have to be communicated.


By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

LukeMathWalker commented 6 months ago

Thank you for the excellent PR ❤️ I only have one comment related to path manipulation. Once that is solved we can merge.

ClementTsang commented 6 months ago

Rebased to the newest main and cleaned up a bit along with the suggestion.