gwsmedia/composer-patch-manager

此包的最新版本(dev-master)没有可用的许可信息。

composer-patches改进了!一个用于启发式应用composer补丁的插件。

dev-master 2023-05-25 11:52 UTC

This package is not auto-updated.

Last update: 2024-09-27 16:04:03 UTC


README

此插件的目标是与composer一起轻松生成和应用补丁。

任何对包所做的更改都可以保存到补丁文件中,然后在包更新或重新安装时手动或自动重新应用。

composer-patches有何不同?

composer-patches 是一个很好的插件,如果你只想简单地将现有的补丁应用到同一版本的包上。

CPM可以在需要时为你生成这些补丁,并且还会尝试启发式地应用补丁,如果新版本更改了代码并且它难以最初应用。

生成的补丁和 composer-patches.json 文件都与 composer-patches 兼容,因此很容易在两个插件之间切换。请注意,目前CPM只支持 本地 补丁。

要求

此插件要求您安装 gitphpcomposer,并且PHP的 exec() 函数在CLI上已启用。

如果您在服务器上,并且这些工具不可用且无法安装,建议您在本地使用此插件并上传任何更改。

安装

composer require gwsmedia/composer-patch-manager

如果您希望CPM自动应用补丁,以下命令将添加必要的钩子:vendor/bin/cpm init

如果您希望仅在安装或仅在使用更新时应用补丁,在运行上述命令后,分别在 composer.json 中的 post-package-installpost-package-update 中删除ComposerPatchManager钩子。

用法

生成补丁

对使用composer安装的包进行任何必要的更改(在 vendor/ 或在您的 composer.json 中定义的 installer-paths 的目标处)。

然后在 composer-patches.json 中定义您想要生成补丁的包。

{
	"packages": ["vendor/package"]
}

准备好后,运行 vendor/bin/cpm generate

CPM将遍历每个定义的包,将补丁文件输出到 patch/vendor--package.patch,并在 composer-patches.json 中更新该文件的路径。

每个包的所有更改都集中在一个单独的补丁文件中,因此您可以自由地修改后重新生成。

应用补丁

composer-patches.json 中定义的所有补丁都将被应用。如果使用上述命令生成,它们将自动添加到配置文件中,但也可以添加其他补丁。

{
	"patches": {
		"vendor/project": {
			"Patch title: "patch/custom.patch"
		}
	}
}

现在,如果您运行了 vendor/bin/cpm init,CPM将尝试在相关包安装或更新时应用这些补丁。

如果您想一次性运行,请使用:vendor/bin/cpm apply

打补丁过程

CPM使用以下启发式方法应用补丁(使用 git diff --no-index

  1. 正常尝试应用补丁
  2. 然后尝试使用 --recount(忽略行号)
  3. 然后尝试使用 -C1(仅使用两边的1行上下文)
  4. 最后,如果仍然失败,尝试使用 --reject,它将应用补丁中的任何可应用块,失败块将存储在 .rej 文件中。
    • CPM将对这个命令进行测试运行,并在执行更改之前询问用户是否要继续。
    • 然后,它会向用户显示所有被拒绝的块列表。
    • 请注意:如果您使用此方法继续,补丁文件中的所有更改都不会被应用,因此请确保补丁中的代码不依赖于被拒绝的块。如果是这样,最好在本地手动应用被拒绝的块,进行测试,然后上传。

示例composer-patches.json

{
	"packages": ["psr/container", "drupal/quiz"],
	"patches": {
		"psr/container": {
			["patch/psr--container.patch"]
		},
		"drupal/quiz": {
			[
				"patch/drupal--quiz.patch",
				"patch/external.patch"
			]
		}
	}
}

已知问题

  • 目前,您必须只在根项目目录(定义了composer.json和composer.lock)中运行/vendor/bin/cpm命令。
  • 在composer.json中定义的repositories使用type: path和相对路径将会破坏generate命令。
  • 所有补丁都必须相对于项目根目录 - 这对于例如从drupal.org下载的补丁并不理想,因为这些补丁将与包文件夹相关,但可以通过手动应用补丁,然后运行generate命令来将其包含在集体补丁文件中。