ChatGPT解决这个技术问题 Extra ChatGPT

How to force composer to reinstall a library?

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.

One option would be to delete composer.lock and then run composer install
composer reinstall vendor/package

B
Black

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.


@Loenix, unlock them.
I've had cases where the local cache was corrupted, so even after deleting the vendor directory I kept reinstalling a broken dependency. composer clearcache is a good addition in such cases.
This seems like a very radical approach considering that composer then needs to reinstall all packages when the OP just needs one package reinstalled. 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.
if composer clearcache doesn't work you can delete the /home/[username]/.cache directory. That'll force a re-download. Useful if you use private composer packagist, in addition to packagist.composer.org, and someone makes changes without adding a new tag.
Composer does not necessarily only install in the vendor directory, so even as a heavy-handed approach it does not work in all situations.
B
Bram Gerritsen

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.


Initially your -prefer-source suggestion didn't work until I realized that I had to remove and reinstall all libraries for this to work as I intended and then composer status -v gave me the info with the changes.
That did not work for me, since 2021-05 we can use composer reinstall <package-name>
Y
Yerke

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


or 'composer require vendor/package-i-messed-up' would be good too
If that doesn't work, you might run composer clearcache first in case the cache got corrupted for some reason.
This is the right way. And to clarify, it does need to be the /vendor/ that is removed for composer to reinstall it from the lock file. If one removes just the directory and leaves the named directory behind e.g. /vendor// then it won't re-install.
A
Attila Fulop

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


If that doesn't work, you might run 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
@NicoHaase only if -w, --with-dependencies or -W, --with-all-dependencies argument is passed to composer.
No, even ` composer update vendor/library-name` will update that library instead of resetting it to the version that was installed before modifying the sources
@NicoHaase the library itself might be updated (in composer.lock) based on the given version constraints defined in composer.json. But not the dependency tree.
h
hakre

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.

K
Kuya

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
Check out composer reinstall <package-name>
I
Ilya Kolesnikov

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


Please add some explanation to your answer such that others can learn from it - this does not look like a good solution to me, as it contains the possibility that the dependencies of other packages change
I've added explanations as much as possible. These commands are native by Composer and recommended by SO community. If you need some more explanations please write what exactly do you want to see, I'll try to answer
Is there any good reason not to call composer install after removing the package's folder from the vendor directory? This would skip all unneccessary changes in the lock file
Removing vendor directory is not a native action, 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?
"Proofs"? No. But do you have any proofs that reinstalling does install the very same version of that package that was used before?
f
frederickjh

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

For me, this only overwrites the changes if there is a new version of the package. Like composer update does.
Y
Yevgen

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.


Please share more details - why should this be an obvious answer? This changes the version dependencies, so it does not look really good to me
@NicoHaase it seems obvious because it is built in composer command, but you have a point. I updated answer.
Why not remove the vendor folder and run composer install instead? What's the point in removing and reinstalling the package after all?
@NicoHaase I assume that need to re-install one package arises when you are developing package / working on it. In this case you can hardly screwed up with version compatibility. This is why I don't share your worries. Advantages are: 1) Re-installing one package usually faster then reinstalling all of them 2) If I need to make it multiple times I can lose concentration so I don't want to rm -rf around when it is not mandatory.
l
luenemam

Since Composer 2.1 you can do

composer reinstall vendor/package

see https://getcomposer.org/doc/03-cli.md#reinstall


This has been answered in stackoverflow.com/a/67882743/367456 already.
P
PaulH

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 composer require or composer install.