tatter / patches
为 CodeIgniter 4 自动更新项目
资助包维护!
tattersoftware
paypal.me/tatter
Requires
- php: ^7.3 || ^8.0
README
为 CodeIgniter 4 自动更新项目
快速开始
- 使用 Composer 安装:
> composer require --dev tatter/patches
- 使用以下命令更新:
> vendor/bin/patch
描述
补丁 帮助在框架更改影响项目源代码时保持 CodeIgniter 4 项目更新。使用单个简单命令修补您的开发实例并解决任何冲突,以便轻松解决。
要求
补丁 建立在 Git 和 Composer 之上,因此需要在您的 $PATH
中安装并可访问这两个程序。此外,patch
命令假定以下内容(如果不符合则会失败)
- 您的项目位于现有的 Git 仓库中(已配置 Git 用户)
- CodeIgniter 4 框架是通过 Composer 在您的 vendor/ 目录中安装的
- 当前分支是 "clean"(没有未提交的更改或未提交的文件)
- 您的项目文件位于标准位置(app/、public/、env、spark)
- 在 app/ 或 public/ 中没有补丁过程会干扰的忽略文件
- vendor/ 文件夹必须被忽略以在 Git 仓库中跟踪
安装
通过 Composer 轻松安装以利用 CodeIgniter 4 的自动加载功能并始终保持最新状态
> composer require --dev tatter/patches
注意:虽然 补丁 可在生产环境中运行,但强烈建议您在开发环境中安装它(使用
--dev
),然后部署仓库更改到生产环境。
您还可以下载脚本并将其添加到您喜欢的项目中。
用法
补丁 随附一个名为 patch
的单个脚本,Composer 会将其视为二进制文件并将其部署到您的 vendor/bin/ 文件夹。只需运行命令即可启动补丁过程
./vendor/bin/patch
参数
大多数情况下,简单的脚本就是您想要的,但 patch
可以接受一些参数来改变补丁过程的行为。接受 "commit-ish" 的参数可以使用 Git 识别的任何内容(分支、散列、标记、引用、修订等)。
为确保补丁在 Docker 容器中正确工作,您可能需要使用 -e
和 -n
标志分别手动设置 user.email
和 user.name
的值。这是必要的,因为 Docker 容器通常没有预先配置 Git。
帮助 (-h)
显示最新的命令帮助
Usage: ./patch [-c <current version>] [-v <target version>] Patches an existing CodeIgniter 4 project repo to a different version of the framework. Options: -h Help. Show this help message and exit -c commit-ish Alternate version to consider "current" (rarely needed). -v commit-ish Version to use for patching. Defaults to the latest. -e Git global user.email. -n Git global user.name.
版本 (-v )
手动设置要修补的版本。如果您需要停在特定的版本,或者如果您的项目指向 develop
分支并且您不希望某些提交,这很有用。示例
-
将当前安装的仓库修补到特定版本。./vendor/bin/patch -v 4.1.2
-
修补到特定提交。./vendor/bin/patch -v dev-develop#0cff5488676f36f9e08874fdeea301222b6971a2
当前 (-c )
忽略当前已安装的框架版本,而使用指定的版本。在大多数情况下,这不太可能需要,但在新安装或如果您使用Composer更新但忘记先运行补丁的情况下可能会有所帮助。示例
- 假设仓库处于较旧的状态并打补丁。
工作原理
补丁 是一个调用 git
和 composer
的 shell 脚本。当被调用时,它将模拟从您当前版本的框架升级到最新或指定版本。这种模拟假设您的项目中没有文件被修改,这很可能不是事实,因此,阶段性的模拟将作为一个三向合并与您的当前项目根进行比较。补丁 在一个专用分支(tatter/scratch
)中工作,因此它永远不会直接修改您的项目。所有补丁文件都暂存于 tatter/patches
,这样您在合并或推送到远程之前可以审查它们。考虑以下示例。
添加的文件
CodeIgniter 决定是时候添加一个 Widget
组件了,它包括用于配置的 app/Config/Widget.php。您的项目正在运行版本 4.1.2
,但希望更新到 4.2.0
以使用这个新组件。当 补丁 模拟这些版本之间的更新时,git
将注意到这个新文件
A app/Config/Widget.php
当补丁的最后阶段运行时,这个新文件将被合并到您的项目中。
更改的文件
除了上面的配置文件外,Widget
还附带了一个很棒的新的 WidgetFilter
。与所有 Filters
一样,它必须在您的 app/Config/Filters.php 文件中别名为先才能使用。框架已经为新项目处理了这一点
class Filters extends BaseConfig { /** * Configures aliases for Filter classes to * make reading things nicer and simpler. * * @var array */ public $aliases = [ 'csrf' => CSRF::class, 'toolbar' => DebugToolbar::class, 'honeypot' => Honeypot::class, 'widget' => WidgetFilter::class, ];
当补丁的最后阶段运行时,git
将检查您在 app/Config/Filters.php 中的现有文件,并执行其签名 三向合并(技术上,这是通过 cherry-pick
完成的)。这意味着如果您的版本没有更改,或者如果它以兼容的方式进行了修改,那么 补丁 将为您应用编辑,而无需干预。
冲突
兼容的更改很好,但假设您有一个奇怪的布局癖好(不予评判)并且您项目中的 app/Config/Filters.php 文件现在看起来像这样
class Filters extends BaseConfig { public $aliases = ['csrf' => CSRF::class,'toolbar' => DebugToolbar::class,'honeypot' => Honeypot::class];
您可能道德败坏,但 git
将不知道如何处理合并新的 WidgetFilter
,您现在有一个冲突。补丁 将清理并使您的仓库处于冲突状态,这样您就可以继续使用您最喜欢的冲突解决方法。在您最喜欢的文本编辑器中打开 app/Config/Filters.php 以找到冲突
class Filters extends BaseConfig { <<<<<<< HEAD public $aliases = ['csrf' => CSRF::class,'toolbar' => DebugToolbar::class,'honeypot' => Honeypot::class]; ======= /** * Configures aliases for Filter classes to * make reading things nicer and simpler. * * @var array */ public $aliases = [ 'csrf' => CSRF::class, 'toolbar' => DebugToolbar::class, 'honeypot' => Honeypot::class, 'widget' => WidgetFilter::class, ]; >>>>>>> tatter/scratch
一旦您解决了所有冲突,您就可以完成 cherry-pick。例如,在这种情况下,您将更新文件并运行以下命令
git add app/Config/Filters.php git cherry-pick --continue
故障排除
兼容性
如果您不确定 补丁 是否与您的环境兼容,建议您首先运行测试用例。克隆或下载仓库,并使用它们的 run
命令启动测试
./tests/run
清理
- 始终安全地删除
tatter/scratch
- 这个分支对您的项目没有任何相关内容。 - 始终安全地删除
tatter/patches
,但如果您尚未提交和合并更改,那么您将需要重新开始补丁过程。 - 如果您决定不再使用 补丁,只需删除 Composer 包或删除脚本即可 - 这就是全部!
恢复
补丁非常保守,并且采取了很多预防措施以确保不会触及您的任何项目文件。如果您对Git相对较新,并且遇到合并冲突而变得一团糟,首先应该做的事情是:不要慌张!您的文件是安全的,您的仓库是完整的,唯一可能损害它的是在互联网上输入您不理解的一堆命令。
首先要知道的是,补丁使用两个专用分支:tatter/scratch
是它暂存所有文件的地方,而tatter/patches
是它尝试合并的地方。如果您陷入困境,请确保您知道您在哪个分支上使用git branch
- 很可能您的项目使用以下典型“主”分支之一:develop
、main
或master
。
接下来要注意的是,可能导致冲突的最终合并阶段实际上是由一个cherry-pick
处理的。这是一个Git技术过程,用于隔离单个提交并将其应用到另一个分支上。如果您正在进行cherry-pick
,则git status
应显示当前状态,以及任何冲突文件和如何继续的一些提示。
git status On branch tatter/patches You are currently cherry-picking commit a8b4361. (all conflicts fixed: run "git cherry-pick --continue") (use "git cherry-pick --skip" to skip this patch) (use "git cherry-pick --abort" to cancel the cherry-pick operation)
如上所述,您可以使用以下命令随时中止整个过程并返回到未更改的项目状态(将develop
替换为您的主分支名称):
git cherry-pick --abort
git switch develop
支持
还需要帮助吗?
- 访问CodeIgniter论坛寻求帮助。
- 点击补丁仓库上的“赞助”按钮,获取高级支持选项。
GitHub问题仅用于错误报告和功能请求。打开支持问题将被关闭,其作者会受到责难。