gwsmedia / composer-patch-manager
composer-patches改进了!一个用于启发式应用composer补丁的插件。
Requires
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只支持 本地 补丁。
要求
此插件要求您安装 git
、php
和 composer
,并且PHP的 exec()
函数在CLI上已启用。
如果您在服务器上,并且这些工具不可用且无法安装,建议您在本地使用此插件并上传任何更改。
安装
composer require gwsmedia/composer-patch-manager
如果您希望CPM自动应用补丁,以下命令将添加必要的钩子:vendor/bin/cpm init
如果您希望仅在安装或仅在使用更新时应用补丁,在运行上述命令后,分别在 composer.json
中的 post-package-install
或 post-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
)
- 正常尝试应用补丁
- 然后尝试使用
--recount
(忽略行号) - 然后尝试使用
-C1
(仅使用两边的1行上下文) - 最后,如果仍然失败,尝试使用
--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
命令来将其包含在集体补丁文件中。