作曲家和第三方错误

Composer and third party bugs

在开发 Symfony2 项目时,我经常遇到第三方包中的错误。大多数时候,这些错误很微妙,但很难找到。例如,仅在本周我就发现了三个错误,其中使用简单的 if ( $value ) 构造测试了一个值,但需要使用 ( $value !== null)( $value !== false ).

在相关项目的 github 页面上没有足够的权限,我能做的最好的事情就是推送拉取请求。合并请求通常需要相当长的时间。同时,特别是在使用 master 版本时,合并其他拉取请求,从而导致 composer 进行更新。发生这种情况时,任何本地错误修复都将恢复为原始代码。

有什么方法可以处理这种情况吗?

理想情况下,我希望第三方包能够更新,但我的修改仍然存在。当然,直到拉取请求被合并。

Composer 不支持开箱即用的此功能。原因很简单,不应该使用其他库的开发版本。但不要担心,您可以通过在 GitHub 上分叉项目轻松解决此问题。当然,这意味着 很多 开销,但这是我能想到的解决此问题的最佳解决方案。

请注意,与补丁方法相比,此方法有几个优点:

  1. 您可以直接从您的复刻创建拉取请求。
  2. git 合并过程将识别任何冲突。

自动执行此过程的脚本很简单:

#!/bin/sh

git fetch upstream
git checkout master
git merge upstream/master

您可以创建一个 Composer post update/install 脚本,如果它是您的分支之一,它会在每个项目的本地目录中执行这些命令。 (我将这个实现部分留给了 reader。但是需要先在本地创建存储库,因为 Composer 只下载没有存储库数据的最新文件。这可能会向项目添加巨大的 .git 文件夹因为有些项目非常庞大。)

有一个项目允许您在使用 composer 下载包后应用补丁。它是为与 Drupal 项目一起使用而创建的,但我相信它也应该与您自己的补丁一起使用。

https://github.com/jpstacey/composer-patcher

否则,您可以分叉项目、进行改进、提交拉取请求,同时在 composer 中使用您自己的分叉存储库。请参阅 [此答案][) 以获取有关如何实现该目标的详细说明。

编辑:
明星们说现在快到 2016 年了,有些事情发生了变化。 jpstacey/composer-patcher 被认为已弃用,支持 netresearch/composer-patches-plugin 项目。这是一个 Composer 插件,功能基本相同,但它也可以应用本地补丁。