ChatGPT解决这个技术问题 Extra ChatGPT

如何强制作曲家重新安装库?

我正在使用 ZF2 框架应用程序,它有一个 .gitignore 可以防止将外部库提交给 git。在调试时,我喜欢在库的源代码中到处更改东西,以了解事情是如何工作的。如果这些是版本控制的,那么将它们恢复到原始状态将非常容易。

如何强制 Composer 重新安装特定的框架,以便我可以再次获得全新的未修改副本?

PS:请不要建议删除 .gitignore 文件,因为它的存在是有原因的;它可以防止我的第三方库进入我的应用程序的存储库。我总是可以在自动部署期间安装它们。

这同样适用于 Laravel 框架:它也 gitignores 供应商文件夹。

一种选择是删除 composer.lock 然后运行 composer install
作曲家重新安装供应商/包

B
Black

首先执行 composer clearcache

然后清除您的供应商文件夹

rm -rf vendor/*

或者更好的是,只需删除产生问题的特定模块,以避免重新下载。


@Loenix,解锁它们。
我遇到过本地缓存损坏的情况,因此即使在删除供应商目录后,我仍会不断重新安装损坏的依赖项。 composer clearcache 在这种情况下是一个很好的补充。
考虑到当 OP 只需要重新安装一个包时,composer 需要重新安装所有包,这似乎是一种非常激进的方法。 composer require vendor/package 也会在更短的时间内完成 OP 想要做的事情。这么多人对这个答案投了赞成票,我有点惊讶。
如果 composer clearcache 不起作用,您可以删除 /home/[username]/.cache 目录。这将强制重新下载。如果您使用私有作曲家 packagist 以及 packagist.composer.org 并且有人在不添加新标签的情况下进行更改,则很有用。
Composer 不一定只安装在供应商目录中,因此即使作为一种严厉的方法,它也并非在所有情况下都有效。
B
Bram Gerritsen

您可以为 composer 使用 --prefer-source 标志来检查带有 VCS 信息(如果有的话)的外部包。您可以简单地恢复到原始状态。此外,如果您发出 composer update 命令,composer 将检测您在本地所做的任何更改并询问您是否要丢弃它们。

您的 .gitignore 文件与您的根项目(ZF2 框架)相关,它会阻止供应商目录(您的第三方库所在的位置)提交到您自己的 VCS。忽略文件与供应商的 git 存储库无关。


最初,您的 -prefer-source 建议不起作用,直到我意识到我必须删除并重新安装所有库才能使其按预期工作,然后 composer status -v 向我提供了更改信息。
这对我不起作用,自 2021 年 5 月起,我们可以使用 composer reinstall <package-name>
Y
Yerke

我不想删除 vendor/ 目录中的所有包,所以我是这样做的:

rm -rf vendor/package-i-messed-up composer install 再次


或者'composer require vendor/package-i-messed-up'也很好
如果这不起作用,您可以先运行 composer clearcache,以防缓存由于某种原因损坏。
这是正确的方法。为了澄清,它确实需要删除 /vendor/ ,作曲家才能从锁定文件中重新安装它。如果仅删除 目录并将 命名目录留在后面,例如 /vendor// 则不会重新安装。
A
Attila Fulop

我做了什么:

删除了该特定库的文件夹 composer update --prefer-source vendor/library-name

它与它的 git repo 一起再次获取库


如果这不起作用,您可以先运行 composer clearcache,以防缓存由于某种原因损坏。
在这种情况下不应运行 composer update,因为这会更改依赖项
@NicoHaase 仅当 -w, --with-dependencies-W, --with-all-dependencies 参数传递给作曲家。
不,即使 `composer update vendor/library-name` 也会更新该库,而不是将其重置为修改源之前安装的版本
@NicoHaase 库本身可能会根据 composer.json 中定义的给定版本约束进行更新(在 composer.lock 中)。但不是依赖树。
h
hakre

相关功能请求是 https://github.com/composer/composer/issues/3112

在 2021 年 5 月,“重新安装”命令补丁被合并:https://github.com/composer/composer/pull/9915 - 它在作曲家版本 2.1.0 和所有更高版本中可用。

reinstall 命令已合并并可从 2.1.0 开始使用:

composer reinstall <package-name> # Removes and installs the package.

K
Kuya

重新安装依赖项。之前在 Linux 上删除 vendor 文件夹(手动)或通过 rm 命令(如果你在项目文件夹中,当然):

rm -rf vendor/

composer update -v

https://www.dev-metal.com/composer-problems-try-full-reset/


在这种情况下不应运行 composer update,因为这会更改依赖项
查看composer reinstall <package-name>
I
Ilya Kolesnikov

简短的回答

您可以使用 && 在一个 cli 命令中执行它:

composer remove vendor/package && composer require vendor/package:version

详细解答

通过命令删除现有包:

composer remove vendor/package

这将从/vendor 中删除包的文件夹,从composer.json 中删除行,并从composer.lock 中删除包的整个记录,同时删除未使用的依赖项并且不删除其他包使用的依赖项

然后使用命令安装首选的一个:

composer require vendor/package:version

这将以正确的方式安装具有所需版本的包,向 composer.json 添加行,向 composer.lock 添加记录以及所有需要的依赖包,如果有用于多个包的包,Composer 将尝试安装适合的版本都使用包。如果它不能解决这个问题,它将崩溃并显示相应的错误消息

链接

How to install a specific version of package using Composer?

How to remove a package from Laravel using composer?

使用 Composer 安装、卸载和更新模块主题等:https://modulesunraveled.com/drupal-8-composer-and-configuration-management/installing-and-uninstalling-modules-composer


请在您的答案中添加一些解释,以便其他人可以从中学习 - 这对我来说似乎不是一个好的解决方案,因为它包含其他包的依赖关系发生变化的可能性
我已经尽可能多地添加了解释。这些命令由 Composer 原生并由 SO 社区推荐。如果您需要更多解释,请写下您到底想看到什么,我会尽力回答
从供应商目录中删除包的文件夹后,是否有充分的理由不调用 composer install?这将跳过锁定文件中所有不必要的更改
删除供应商目录不是本机操作,composer remove 是删除一个包的命令,composer 需要 - 安装它手动编辑 composer.json、composer.lock、/vendor 之类的东西是不好的做法删除整个文件夹很慢并且不必要 在您能够为新版本的软件包制作 composer install 之前,您需要编辑 composer.json 如果您在“要求”部分中这样做,这是不好的做法您是否有任何证据可以更好地手动删除文件夹而不是通过本机作曲家命令重新安装一个包?
“证明”?没有。但是您是否有任何证据表明重新安装确实安装了与之前使用的相同版本的软件包?
f
frederickjh

正如用户@aaracrr 在对另一个答案的评论中指出的那样,最好的答案可能是重新要求具有相同版本约束的包。

IE。

composer require vendor/package

或指定版本约束

composer require vendor/package:^1.0.0

对我来说,如果有新版本的包,这只会覆盖更改。就像 composer update 一样。
Y
Yevgen

出于某种原因,没有人建议强制重新安装的明显和最直接的方法:

> composer remove vendor-name/package-name && composer vendor-name/package-name

请注意,此命令将安装最新版本的软件包。如果您使用的是旧版本的包并且包没有向后兼容性,这将破坏版本兼容性。您可以考虑先备份您的 composer.json


请分享更多细节 - 为什么这应该是一个明显的答案?这改变了版本依赖关系,所以对我来说看起来不太好
@NicoHaase 似乎很明显,因为它是内置在 composer 命令中的,但是您有道理。我更新了答案。
为什么不删除供应商文件夹并改为运行 composer install?毕竟删除和重新安装软件包有什么意义?
@NicoHaase 我假设在开发包/处理包时需要重新安装一个包。在这种情况下,您很难搞砸版本兼容性。这就是为什么我不分享你的担忧。优点是: 1)重新安装一个包通常比重新安装所有包更快 2)如果我需要多次安装,我可能会注意力不集中,所以我不想在不是强制性的时候rm -rf
l
luenemam

Composer 2.1 以来,您可以

composer reinstall vendor/package

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


这已在 stackoverflow.com/a/67882743/367456 中得到解答。
P
PaulH

2022 年
您可以使用 composer status 列出您更改的库。
然后使用 composer resinstall vendor/package 覆盖更改。

这不会像使用 composer requirecomposer install 的解决方案那样更改已安装库的版本。