I'm using the ZF2 skeleton app and it has a .gitignore that prevents external libraries from being commited to git. While debugging I like to go and change stuff here and there in the libraries' source to learn how things work. If these were version controlled it would be very easy to revert them back to their original state.
How can I force Composer to reinstall a particular framework so that I can get a fresh -unmodified- copy again?
PS: Please don't suggest removing the .gitignore file since it's there for a reason; it prevents my third party libraries from getting into my app's repository. I can always install them during an automated deployment.
The same applies to Laravel framework: it also gitignores the vendor folder.
First execute composer clearcache
Then clear your vendors folder
rm -rf vendor/*
or better yet just remove the specific module which makes problems to avoid having to download all over again.
You can use the --prefer-source
flag for composer to checkout external packages with the VCS information (if any available). You can simply revert to the original state. Also if you issue the composer update
command composer will detect any changes you made locally and ask if you want to discard them.
Your .gitignore file is related to your root project (ZF2 skeleton) and it prevents the vendor dir (where your third party libs are) from committing to your own VCS. The ignore file is unrelated to the git repo's of your vendors.
composer status -v
gave me the info with the changes.
composer reinstall <package-name>
I didn't want to delete all the packages in vendor/
directory, so here is how I did it:
rm -rf vendor/package-i-messed-up composer install again
composer clearcache
first in case the cache got corrupted for some reason.
What I did:
Deleted that particular library's folder composer update --prefer-source vendor/library-name
It fetches the library again along with it's git repo
composer clearcache
first in case the cache got corrupted for some reason.
composer update
should not be run in this case, as this changes the dependencies
-w, --with-dependencies
or -W, --with-all-dependencies
argument is passed to composer.
The relevant feature request is https://github.com/composer/composer/issues/3112
In 2021-05 the "reinstall" command patch got merged: https://github.com/composer/composer/pull/9915 - it is available in composer version 2.1.0 and all later ones.
The reinstall
command is merged and availabe since 2.1.0
:
composer reinstall <package-name> # Removes and installs the package.
Reinstall the dependencies. Remove the vendor folder (manually) or via rm command (if you are in the project folder, sure) on Linux before:
rm -rf vendor/
composer update -v
https://www.dev-metal.com/composer-problems-try-full-reset/
composer update
should not be run in this case, as this changes the dependencies
composer reinstall <package-name>
Short answer
you can execute it in one cli command with &&:
composer remove vendor/package && composer require vendor/package:version
Detailed answer
Remove existing package by command:
composer remove vendor/package
this will remove folder of package from /vendor, row from composer.json and whole record of package from composer.lock right way with removing not used dependencies and not removing dependencies which used by another packages
Then install preferred one with command:
composer require vendor/package:version
this will install package with desired version right way with adding row to composer.json, adding record to composer.lock and all needed dependent packages if there would be package which is used in more that one package, Composer will try to install version which fits all using packages. If it will not resolve this it will crash with corresponding error message
Links
How to install a specific version of package using Composer?
How to remove a package from Laravel using composer?
Install, Uninstall and Update Modules Themes etc with Composer: https://modulesunraveled.com/drupal-8-composer-and-configuration-management/installing-and-uninstalling-modules-composer
composer install
after removing the package's folder from the vendor directory? This would skip all unneccessary changes in the lock file
composer remove
is a command that makes to remove one package, composer require - to install it Editing anything like composer.json, composer.lock, /vendor manually is bad practice Removing whole folder is slow and unnecessary Before you will be able to make composer install
for new version of package, you'll need to edit composer.json which is bad practice if you do it in "require" section Do you have any proofs that manually removing folders better than reinstalling one package by native composer commands?
As user @aaracrr pointed out in a comment on another answer probably the best answer is to re-require the package with the same version constraint.
ie.
composer require vendor/package
or specifying a version constraint
composer require vendor/package:^1.0.0
composer update
does.
For some reason no one suggested the obvious and the most straight forward way to force re-install:
> composer remove vendor-name/package-name && composer vendor-name/package-name
Be aware that this exact command will install latest version of the package. If you was using old version of the package and package does not have backward compatibility this will brake version compatibility. You might consider backing up your composer.json
first.
composer install
instead? What's the point in removing and reinstalling the package after all?
rm -rf
around when it is not mandatory.
Since Composer 2.1 you can do
composer reinstall vendor/package
see https://getcomposer.org/doc/03-cli.md#reinstall
In 2022
You can use composer status
to list the libraries you changed.
Then composer resinstall vendor/package
to overwrite the changes.
This does not change the version of the installed library like the solutions with or composer require
.
composer install
Success story sharing
composer clearcache
is a good addition in such cases.composer require vendor/package
will do what the OP wants and in less time too. I am a bit surprised that so many have up-voted this answer.