Skip to content

Command to update Cargo.lock to minimal versions #4100

Closed

Description

@matklad

From today's meeting.

Problem:

You write a library A, which depends on B, so you put B = 1.0 in A's Cargo.toml. The you run Cargo build, and Cargo greedily pulls B 1.1 into the lockfile. Then you accidentally start depending on features introduced in 1.1, but you don't change Cargo.toml. Your test locally pass, and CI passes as well, and you publish a crate whose Cargo.toml is a lie.

Solution:

Add cargo update --minimal, which generates lockfile picking the minimum possible version of all crates (it's not possible, of course, because there's no total order on dependency graphs, but some heuristics might work well in practice). Then in CI environment you generate the minimal lockfile to make sure you don't accidentally depend on newer than Cargo.toml features.

Activity

  1. matklad commented on May 26, 2017

    @matklad
    ContributorAuthor

    Note that we can envision some kind of static solution here, for example, by tagging library functionality with #since attribute. However, actually testing things is still needed, because you may depend on a critical bugfix from the dependency.

  2. added
    C-feature-requestCategory: proposal for a feature. Before PR, ping rust-lang/cargo if this is not `Feature accepted`
    on Sep 25, 2017
  3. Eh2406 commented on Jan 29, 2018

    @Eh2406
    Contributor

    This I think would just involve changing

    b.summary.version().cmp(a.summary.version())
    to depend on an argument; Then bubble that argument up till it is user facing.

  4. Eh2406 commented on Feb 21, 2018

    @Eh2406
    Contributor

    I am still learning cargo internals, but I would be willing to help someone who wanted to take this on!

  5. bluetech commented on Feb 22, 2018

    @bluetech
    Contributor

    Then you accidentally start depending on features introduced in 1.1, but you don't change Cargo.toml

    Perhaps there's some way to tackle this problem head-on? Probably not, but it's interesting to think about. Two possible ways I can think of:

  6. alexcrichton commented on Feb 26, 2018

    @alexcrichton
    Member

    @Eh2406 I'd imagine that with yours and @aidanhs's work on the resolver recently it may be relatively easy to encode this as a constraint and have it finish in a hopefully-not-too-long amount of time too!

  7. Eh2406 commented on Mar 5, 2018

    @Eh2406
    Contributor

    The relevant line of code has moved to:

    b.summary.version().cmp(a.summary.version())

    I think we would add a arg to:
    struct RegistryQueryer<'a> {

  8. Dylan-DPC-zz commented on Mar 5, 2018

    @Dylan-DPC-zz

    Can give this a try :)

  9. Eh2406 commented on Mar 5, 2018

    @Eh2406
    Contributor

    @Dylan-DPC That is wonderful!

    The idea is that the sort on line L664 determines the order that cargo tries versions of packages. Currently from newest to oldest and we want to reverse that order.
    Steps as I see it:

    • Add a -Z flag, like I did in https://github.com/rust-lang/cargo/pull/4990/files
    • Get that flag on L364 something like config.cli_unstable().minimal_versions and pass it to RegistryQueryer
    • Use it in the sort function, if minimal_versions {a.summary.version().cmp(b.summary.version()) } else the existing code
    • Add it to some tests. I'd fine them by (temporarily) hard coding minimal_versions to true and looking at wich test in cargo\tests\testsuite\resolve.rs fail.

    How can I be helpful!?

  10. Dylan-DPC-zz commented on Mar 5, 2018

    @Dylan-DPC-zz

    Thanks @Eh2406 will take a look whenever I'm free and see how far I get :)

  11. Eh2406 commented on Mar 5, 2018

    @Eh2406
    Contributor

    If that turns out to be challenging, feel free to ask!

  12. Dylan-DPC-zz commented on Mar 11, 2018

    @Dylan-DPC-zz

    @Eh2406

    Get that flag on L364 something like config.cli_unstable().minimal_versions and pass it to RegistryQueryer

    L364 of which file?

  13. Eh2406 commented on Mar 11, 2018

    @Eh2406
    Contributor

    Sorry I wasn't clear
    cargo/src/cargo/core/resolver/mod.rs

  14. added a commit that references this issue on Mar 23, 2018
    bcd0300
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-dependency-resolutionArea: dependency resolution and the resolverA-new-subcommandArea: new subcommandC-feature-requestCategory: proposal for a feature. Before PR, ping rust-lang/cargo if this is not `Feature accepted`

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions