作曲家删除(卸载)所有已安装的软件包(作曲家安装回滚)

composer remove (uninstall) all installed packages (composer install rollback)

我有一个包含 composer.lock 文件的项目。 我使用以下命令安装了软件包:

composer install

现在我想将 composer install 命令回滚到 运行 之前的状态。

如何在不影响 composer.lock 文件的情况下删除所有包? 是否有任何单个 composer 命令可以做到这一点?

我试过了:

composer remove *

但我得到了:

[UnexpectedValueException]
"LICENSE" is not a valid alias.

我试过了:

composer remove */*

但后来我得到一堆印刷品,如:

bin/console is not required in your composer.json and has not been removed
Package "bin/console" listed for update is not locked.

为什么 composer remove * 根本不起作用?据我所知,包名称 VendorName/PackageName 是 Packagist 的通用约定,但不是必须的(如果您使用私有存储库)那么如何一次删除所有名为 IdontHaveAnySlash 等的包?

我可能会使用类似于:

for package in $(composer show | awk '{print }'); do composer remove --no-interaction --dev --no-install "$package"; done

但这不是一个简单的单一 composer 命令。 作曲家也经常抱怨一个包是另一个包的一部分(依赖),所以 composer 不会卸载它。

Removal failed, doctrine/annotations is still present, it may be required by another package. See composer why doctrine/annotations.

因为我的意图是回滚到没有安装任何包但只有文件的状态:composer.lock 并且可能 composer.json 我真的不关心任何依赖项、包版本,下载存储库的 url 等

我只想拥有一个像以前一样没有安装任何依赖项的项目。

是否有任何单个 composer 命令可以做到这一点?

我的:

composer --version

是:

version 2.2.7 2022-02-25 11:12:27

根据 yivi 的回答,我创建了一个简单的测试来验证:

mkdir -p /tmp/composer-install
cd /tmp/composer-install

curl -o composer.json https://raw.githubusercontent.com/composer/composer/18246212db7103d0a2688febcc336f77183275ee/composer.json

curl -o composer.lock https://raw.githubusercontent.com/composer/composer/d955458f271edb4fcc055a394f90a60a8328a2a8/composer.lock

sha1sum composer.json > composer.json.sha1
sha1sum composer.lock > composer.lock.sha1

composer install

sha1sum -c composer.json.sha1
sha1sum -c composer.lock.sha1

输出:

composer.json: OK
composer.lock: OK

所以 composer.jsoncomposer.lock 都不受 composer install 的影响,所以实现 composer install 回滚(卸载)的唯一一件事就是删除vendor目录

rm -rf vendor

但是正如yivi所说:

If some other plugin (e.g Symfony Flex) makes changes to your existing files during the process, you'd better have the project on top of a version control system, in which case reverting is managed by VCS, not of composer.

我没有针对那个案例进行测试。

rm -rf vendor

在任何情况下,install 都不应该对锁定文件进行任何 更改,因此不应该从 [=11= 中“还原”任何内容] 但删除已安装的文件。

如果锁文件最初不存在,则会创建它。

如果一些其他插件(例如 Symfony Flex)在此过程中更改了您现有的文件,您最好将项目置于版本控制系统之上,在这种情况下,恢复由 VCS 管理,而不是作曲家。

As my intention is to rollback to the state that did not have any package installed but only files: composer.lock and potentially composer.json

要让你能够 运行 composer install,你至少需要 composer.json 存在。 install 从锁定文件 (composer.lock) 中读取,但也需要 JSON 配置文件存在。如果锁定文件不存在,update 将改为 运行 并创建锁定文件。

I tried composer remove

removerequire相反。它从 composer.json 中删除包,而 require 添加它们。不是 install 的反义词。 install 没有反义词,因为它在概念上没有多大意义。如果需要删除已安装的项目...可以随时删除。