从编辑器中排除包更新

时间:2015-05-14 10:50:22

标签: composer-php

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

6 个答案:

答案 0 :(得分:9)

  1. 运行此命令,看看你的软件包版本是什么:

    composer show -i
    
  2. 转到composer.json并编辑您希望永远不会更改composer update的软件包,并为其正确编写版本:

    "jacopo/laravel-authentication-acl": "1.3.*", 
    

    更改为:

    "jacopo/laravel-authentication-acl": "1.3.11",
    
  3. 完成!现在,如果您运行composer update此程序包未更新。

答案 1 :(得分:6)

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

$ composer update --interactive

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

答案 2 :(得分:4)

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

composer update vendor1/package1 vendor1/package2 vendor2/*

,这只会更新这些包。

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

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

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

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

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

  • 如果您使用的是自己的软件包,请为要使用的提交标记发布版本。然后将软件切换为使用该确切版本,或使用通配符版本要求,例如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和新软件包中的软件包分支存在依赖关系,则无法正常工作。原因是分支名称将是相同的,但您永远不会知道正在使用哪个提交。也许新软件包使用最近提交的time()第三个软件包,而你自己的软件是一个非常旧的软件,并且之间存在不兼容的变化 - 这将破坏事情,而Composer无法检测到它。

答案 5 :(得分:1)

一种解决方法是使用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将无法下载。