【发布时间】:2020-01-03 16:42:10
【问题描述】:
我们有一个项目使用composer进行依赖管理;它的composer.json 由我们自己的版本控制工具进行外部更改,该工具不会保留require 的历史记录,以便能够使用composer remove 回滚。但它确实完全回滚了composer.json 文件。
当我们更新composer.json 文件时,我们希望从项目中清除现在未使用的包。我们找不到执行此操作的命令。我们有一些想法,但每个想法都有不足之处:
删除
vendor/、composer.lock并运行composer install。问题:很慢;仅在没有插件的情况下工作(否则可能涉及超过目标的vendor和状态的composer.lock);版本将被重置使用
composer show和composer why的组合来确定未使用的包并在它们上运行compose remove。这是我期望在内部命令中实现的,因为它是如此明显。但是,在外部实现会带来一些挑战:只有composer show的文本输出,没有--format=json或其他东西,难以解析,尤其是因为它还受到警告消息(如果有的话)的困扰,无法抑制(-q关闭输出完全,即使对于列出事物的命令,恕我直言非常无用和奇怪)。
注意:我们还使用 wikimedia/composer-merge-plugin 来合并一堆 json 配置,因此我们不能轻易区分新旧 composer.json 文件以获取要成为 remove'd 的包列表,我们需要对只有composer 知道的合并包列表进行操作,并且将仁慈地让我们通过show 瞥见。
实现这一目标最痛苦的途径是什么?
关于使用update:我们不能使用它,因为它会导致以下工作周期:有人删除模块中的依赖项,该模块针对主干进行测试并通过 QA(大约 3 天),然后他们发布他们的更改;然后,为了消除他们的死开销,我必须对所有内容运行更新,这会将所有内容更新为作曲家可能决定的任何随机版本,这反过来意味着触发所有内容的测试和 QA(大约 1 周)。这种工作流程是完全不可接受的。
我只想删除死代码。删除死代码不应该意味着重新开始整个测试周期。
【问题讨论】:
-
如果在您的
composer.json中设置了适当的版本约束,为什么不采用第一种方式呢? “非常慢”到底是什么意思?应该多久执行一次? -
第二种方式:“未使用的包”是什么意思?不应该有任何既没有直接列在
composer.json中也没有通过依赖项要求的安装包 -
@Nico Hasse :对于第一点,我们确实需要担心这很麻烦。仍然需要的包可以通过此操作更改的事实也需要注意,我们现在无法评估其后果。对于第二种方式:
composer除了通过remove之外,没有其他方法可以删除包。composer.json文件可以通过多种方法进行更新,包括手动或使用我们的版本控制工具。因此,可能会出现一个包存在于vendor和composer.lock以及通过插件的任何其他地方,但不再存在于composer.json中。 -
如果同时删除
vendor和composer.lock,则没有任何信息可以确定版本已更改。如果您关心保留当前版本,请检查您的composer.json- 它应该包含正确的版本信息。如果没有,不要责怪工具,而要责怪你的流程。并且如果你使用推荐的移除包的方式,所有只有被移除包需要的包也会被移除 -
我不知道这个插件是做什么的,但也许你应该分享一些例子?对我来说,所有这些听起来都是定制的,以至于我不知道如何提供帮助。为什么要使用这样的插件,而不是可以与 Composer 的内置和支持功能一起使用的简单依赖包?
标签: php composer-php