从编辑器中排除包更新

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从编辑器中排除包更新相关的知识,希望对你有一定的参考价值。

每当我尝试使用"composer require packagename/package"等作曲家添加新包或使用"composer.phar update"时,我都会更新所有已安装的软件包。作曲家有没有选择排除一些我不需要更新的包?

答案

如果您认为需要排除某些软件包的更新,我会认为这是陷入依赖性混乱的开始。你应该在它变得更糟之前清理你的依赖项。

根据我的经验,不想更新依赖关系的最主要原因是当您使用包的分支而不是已发布的版本时。你应该尽可能彻底地解决这个问题:

  • 如果您使用自己的软件包,请为要使用的提交标记发布版本。然后将您的软件切换为使用该确切版本,或使用通配符版本要求,如1.0.*~1.2^1.3.4
  • 如果您使用的是无法直接影响的外部代码,请尝试联系该代码的开发人员并要求他们标记版本。标记版本对于维护理智的依​​赖树非常重要。
  • 如果您无法让外部开发人员标记版本,请找到自己标记的方法:
  • 在Github上克隆他们的存储库,标记版本,并包含您的存储库副本,而不是去packagist.org。
  • composer.json文件的“type = package”存储库条目中创建必要的元数据。
  • 或者至少,当依赖于分支时,为其分配一个版本别名,以便在外部项目开始标记其版本时允许更平滑的转换。请注意,这根本不会解决您当前的问题,但它可能会在未来使事情变得更好。
  • 如果所有其他方法都失败了,您可能会指向composer.json中的某个提交ID。这将

通常,您应该始终能够无条件地运行composer update。如果没有,这是在您自己的composer.json文件中未正确声明的依赖项的警告标志。

不想更新的第二个原因是包中标记为错误修复而不是主要版本增加的不兼容更改。解决方案很简单:

  • 首先,您必须调查出现此类错误的原因:它是否真的是一个不兼容的API更改?如果是,请向该软件包的开发人员提出问题。他们应该创建一个新的错误修复版本,回滚或修复不兼容的更新,如果他们想要保留他们的更改,他们应该使用次要或主要版本增量标记它,具体取决于他们更改的内容。
  • 但是,如果您错误地使用了他们的代码,不知何故不使用公共API,则不太可能修复错误。您应该尝试通过不使用不应该是公共API的东西来修复代码。例如,在Symfony的最新版本中,公共API在代码和文档中被明确标记 - 使用其他东西会在某些时候中断,即使在执行“兼容”版本更新(例如2.6.x到2.7.x)时也是如此。
  • 修复它的另一种方法是在composer.json文件中排除更新的版本:如果你发现版本1.2.5破坏了你的软件,你可以放"external/package":"~1.2"而不是"external/package":"~1.2,!1.2.5"。或者你可能害怕进一步的更新也会破坏你的软件,你会放入"external/package":"~1.2,!>=1.2.5"

还有一件事要补充:如果运行composer require,则不会获得已安装的软件包的更新。他们是固定的。将根据所有已安装的版本选择所需的软件包,并且只有在可用版本与已安装的所有版本兼容的情况下才会安装。请注意,如果您自己的composer.json和新包中的包的分支都存在依赖关系,则无法正常工作。原因是分支名称将是相同的,但您永远不会知道正在使用哪个提交。也许新软件包使用了最近提交的第三个软件包的dev-master,而你自己的软件是一个非常旧的软件,并且它们之间存在不兼容的变化 - 这将破坏事情,而Composer无法检测到它。

另一答案
  1. 运行此命令,看看你的软件包版本是什么: composer show -i
  2. 转到composer.json并编辑您希望永远不会被composer update更改的包,并为此正确编写版本: "jacopo/laravel-authentication-acl": "1.3.*", 改成 : "jacopo/laravel-authentication-acl": "1.3.11",

完成!现在如果你运行composer update这个包不更新。

另一答案

根据我的经验,排除1或某些包的最佳方法是在composer update中使用--interactive。

$ composer update --interactive

执行此操作时,您可以选择要更新的包,并跳过不想更新的包。

另一答案

您可以提供要更新的一个或多个包的名称:

composer update vendor1/package1 vendor1/package2 vendor2/*

这只会更新这些包。

这不是特别排除,包括,但它肯定会更快地更新特定的包。

为了避免使用require命令的更新,您可以手工制作composer.json(这不是那么难),然后在刚刚添加的包上运行上述目标更新。

还可以使用--no-dev来排除开发包(如果你没有开发你所依赖的包,例如在生产中)。这也加速了依赖性分析。

另一答案

使用composer require packagename/package,您需要一个新的包,并且只获得packagename/package及其依赖项的部分更新。

composer update packagename/package可以用于触发相同的部分更新,但是如果你已经在你的packagename/package中有composer.json

另一答案

一个解决方法是使用replace property,但是没有专门的命令,所以你可以像往常一样运行composer require foo/bar(这将创建composer.json),然后为要忽略的包添加一个新的replace部分。

或者自己创建composer.json文件。这是一个例子:

{
    "require": {
        "radic/tmp-underscore-php": "1.2.0"
    },
    "replace": {
        "patchwork/utf8": "*"
    }
}

运行composer install后,将不会下载所需的包patchwork/utf8

以上是关于从编辑器中排除包更新的主要内容,如果未能解决你的问题,请参考以下文章

当我们在TFS中获得最新版本的排除文件时会发生什么?会更新吗?

如何从源代码管理中排除 NuGet 内容

Android Studio:如何从自动完成中重新包含已排除的库?

Jacoco配置-从报告中排除类/程序包

Jacoco配置-从报告中排除类/程序包

Jacoco配置-从报告中排除类/程序包