【问题标题】:How to determine unused packages in a composer project after removing dependencies in composer.json?删除composer.json中的依赖项后,如何确定composer项目中未使用的包?
【发布时间】:2020-01-03 16:42:10
【问题描述】:

我们有一个项目使用composer进行依赖管理;它的composer.json 由我们自己的版本控制工具进行外部更改,该工具不会保留require 的历史记录,以便能够使用composer remove 回滚。但它确实完全回滚了composer.json 文件。

当我们更新composer.json 文件时,我们希望从项目中清除现在未使用的包。我们找不到执行此操作的命令。我们有一些想法,但每个想法都有不足之处:

  1. 删除vendor/composer.lock 并运行composer install。问题:很慢;仅在没有插件的情况下工作(否则可能涉及超过目标的vendor 和状态的composer.lock);版本将被重置

  2. 使用composer showcomposer 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 文件可以通过多种方法进行更新,包括手动或使用我们的版本控制工具。因此,可能会出现一个包存在于vendorcomposer.lock 以及通过插件的任何其他地方,但不再存在于composer.json 中。
  • 如果同时删除vendorcomposer.lock,则没有任何信息可以确定版本已更改。如果您关心保留当前版本,请检查您的 composer.json - 它应该包含正确的版本信息。如果没有,不要责怪工具,而要责怪你的流程。并且如果你使用推荐的移除包的方式,所有只有被移除包需要的包也会被移除
  • 我不知道这个插件是做什么的,但也许你应该分享一些例子?对我来说,所有这些听起来都是定制的,以至于我不知道如何提供帮助。为什么要使用这样的插件,而不是可以与 Composer 的内置和支持功能一起使用的简单依赖包?

标签: php composer-php


【解决方案1】:

我只会运行composer update

如果一个包不再在您的composer.json(或其依赖项之一)中声明,则在您执行update 时它将被删除

是的,它确实具有根据您的限制将您的依赖项更新到可用的最新版本的副作用;但如果你的约束足够严格(如果你的项目关心这种事情,你可以更严格地限制它们)它应该不会有问题。

似乎比为这个用例 IMO 构建特定工具/工作流程更容易。

主要问题似乎是您的团队正在从项目中删除依赖项,而不是跟踪这些删除。事后的任何其他解决方案都可以避免这一点,这是真正的问题。

通过跟踪更改,您可以执行删除 (composer remove) 这些文件的任务,而不会产生任何副作用或额外工作。

【讨论】:

  • 我理解你的思维方式,但你必须想象一下工作周期:有人删除模块中的依赖项,模块针对主干进行测试并通过 QA(大约 3 天),然后他们发布他们的变化;然后,为了消除他们的死开销,我必须在所有内容上运行update,这会将所有内容更新为作曲家可能决定的任何随机版本,这反过来意味着触发所有内容的测试和 QA(大约 1 周)。这种工作流程是完全不可接受的。我只想删除死代码。删除死代码不应该意味着重新启动整个开发周期。
  • 由于您的部署周期的具体情况而引入了该问题,这似乎很不寻常。如今,部署通常意味着从头开始重新创建整个事物,以便为离散版本提供不可变的图像。而且不需要很长时间。 update 花费更少。如果您的团队“无法接受”,您可能必须开发自己的自定义解决方案。这不是微不足道的,因为您必须处理递归/并发/冲突依赖的问题,这就是 composer 为我们所做的。
  • 但问题对于您的设置来说是相当独特的。对于这种场景,updateinstall 可以很好地满足大多数其他设置。
  • 我不同意,我刚刚也发现了这个:stackoverflow.com/questions/27944795/…。现在,说大多数人不需要宇航服,所以我也不应该不是一个非常有建设性的答案:)
【解决方案2】:

所以,假设您想保留现有结构(在我看来,这可能很好地解决您的需求,但也会带来问题),您可以尝试自己实现一个 Composer 插件。使用事件Composer\Installer\POST_DEPENDENCIES_SOLVING,您可能能够访问已解析的依赖项列表和composer.lock 中的包列表。

定义它可以像编写这样一个类一样简单:

<?php

class ComposerDependencyHelper
{
    public static function postDependencies(\Composer\Installer\InstallerEvent $event)
    {
        $composer = $event->getComposer();
    }
}

它在你的根目录composer.json 中通过脚本部分调用:

"post-dependencies-solving": [
            "ComposerDependencyHelper::postDependencies"
        ]

我没有时间进一步检查,但通过 $composer 对象,您应该可以访问大量信息(有关当前文档,请参阅 https://getcomposer.org/apidoc/1.6.2/Composer/Composer.html):

  • getPackage 返回您当前的包(在composer.json 中定义),而getPackage()-&gt;getRequires() 列出依赖项
  • getLockedRepository 可能会返回当前存在于 composer.lock 中的软件包列表

通过一个简单的标记过程(构建“有效”已安装包的列表,将此列表与存储库中的包列表进行比较),您可以识别那些不再需要的依赖项。

为了让整个事情在未来更加干净,你应该停止从composer.json 中删除包而不运行composer remove $package

【讨论】:

  • 谢谢,我去看看;我有一种感觉 post-dependency-solving 仅由 update 调用,它应该进行解析(如果没有锁定文件则安装)。我需要避免这种情况,所以我可能需要看看showwhy 是如何工作的,这就是金矿:show 中没有why 的包很好。
  • 在我对给定代码的测试中,当存在最新的锁定文件时使用install 时也会调用此事件
  • 如果您对composer show 的输出感到满意(因为它包含通过该合并插件所需的所有包),请将其通过管道传输到一个文件并将其用作@ 所描绘的算法的输入987654322@)
  • 我无法将 show 与 json 文件进行比较:composer.json 不完整,composer.lock 与 show 基本相同 :)
  • composer show 输出什么? 所有 当前需要的包,还是仅composer.json 中列出的那些包(不包括合并的包)?
猜你喜欢
  • 2015-12-08
  • 1970-01-01
  • 2013-02-08
  • 2015-01-24
  • 2023-03-25
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
相关资源
最近更新 更多