composer / package-versions-deprecated

:package: Composer addon to efficiently get installed packages' version numbers
MIT License
1.51k stars 9 forks source link

Cannot replace ocramius/package-versions #10

Closed weirdan closed 3 years ago

weirdan commented 3 years ago

Repro repo

https://github.com/weirdan/cannot-replace-packageversions

Steps to reproduce

$ git clone git@github.com:weirdan/cannot-replace-packageversions.git
Cloning into 'cannot-replace-packageversions'...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 0), reused 5 (delta 0), pack-reused 0
Receiving objects: 100% (5/5), 7.38 KiB | 7.38 MiB/s, done.

$ cd cannot-replace-packageversions

$ composer install
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Package operations: 23 installs, 0 updates, 0 removals
  - Installing ocramius/package-versions (1.9.0): Loading from cache
  - Installing symfony/polyfill-php80 (v1.18.1): Loading from cache
[...]

$ composer --version
Composer version 1.10.7 2020-06-03 10:03:56

$ composer require composer/package-versions-deprecated
Using version ^1.11 for composer/package-versions-deprecated
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - don't install ocramius/package-versions 1.9.0|don't install composer/package-versions-deprecated 1.11.99
    - don't install composer/package-versions-deprecated 1.11.99|remove ocramius/package-versions 1.9.0
    - don't install composer/package-versions-deprecated 1.11.99|don't install ocramius/package-versions 1.9.0
    - Installation request for composer/package-versions-deprecated ^1.11 -> satisfiable by composer/package-versions-deprecated[1.11.99].
    - Installation request for ocramius/package-versions (locked at 1.9.0) -> satisfiable by ocramius/package-versions[1.9.0].

Installation failed, reverting ./composer.json to its original content.

Expected

composer/package-versions-deprecated replaces ocramius/package-versions

Actual

Installation fails with the following errors:

$ composer require composer/package-versions-deprecated
Using version ^1.11 for composer/package-versions-deprecated
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - don't install ocramius/package-versions 1.9.0|don't install composer/package-versions-deprecated 1.11.99
    - don't install composer/package-versions-deprecated 1.11.99|remove ocramius/package-versions 1.9.0
    - don't install composer/package-versions-deprecated 1.11.99|don't install ocramius/package-versions 1.9.0
    - Installation request for composer/package-versions-deprecated ^1.11 -> satisfiable by composer/package-versions-deprecated[1.11.99].
    - Installation request for ocramius/package-versions (locked at 1.9.0) -> satisfiable by ocramius/package-versions[1.9.0].

Installation failed, reverting ./composer.json to its original content.

Likely cause

I believe it's caused by this change: https://github.com/composer/package-versions-deprecated/commit/97f2c999fb7398ae25755ec63fe092521f0b0b7b

Seldaek commented 3 years ago

Composer 2 gives you a better explanation of why it's not working:

  Problem 1
    - ocramius/package-versions is locked to version 1.9.0 and an update of this package was not requested.
    - composer/package-versions-deprecated[1.11.99] cannot be installed as that would require removing ocramius/package-versions[1.9.0]. composer/package-versions-deprecated replaces ocramius/package-versions and thus cannot coexist with it.
    - Root composer.json requires composer/package-versions-deprecated ^1.11 -> satisfiable by composer/package-versions-deprecated[1.11.99].

Use the option --with-all-dependencies to allow upgrades, downgrades and removals for packages currently locked to specific versions.

And indeed...

$ composer require composer/package-versions-deprecated --with-all-dependencies
Using version ^1.11 for composer/package-versions-deprecated
./composer.json has been updated
Running composer update composer/package-versions-deprecated --with-all-dependencies
Loading composer repositories with package information
Updating dependencies
Lock file operations: 1 install, 0 updates, 1 removal
  - Removing ocramius/package-versions (1.9.0)
  - Locking composer/package-versions-deprecated (1.11.99)
Writing lock file

Just requiring a package does not allow updating others, so it fails to apply the removal of the original package.