tatter/patches

为 CodeIgniter 4 自动更新项目

v2.1.0 2023-09-26 12:23 UTC

This package is auto-updated.

Last update: 2024-09-07 12:47:59 UTC


README

为 CodeIgniter 4 自动更新项目

快速开始

  1. 使用 Composer 安装: > composer require --dev tatter/patches
  2. 使用以下命令更新: > vendor/bin/patch

描述

补丁 帮助在框架更改影响项目源代码时保持 CodeIgniter 4 项目更新。使用单个简单命令修补您的开发实例并解决任何冲突,以便轻松解决。

要求

补丁 建立在 GitComposer 之上,因此需要在您的 $PATH 中安装并可访问这两个程序。此外,patch 命令假定以下内容(如果不符合则会失败)

  • 您的项目位于现有的 Git 仓库中(已配置 Git 用户)
  • CodeIgniter 4 框架是通过 Composer 在您的 vendor/ 目录中安装的
  • 当前分支是 "clean"(没有未提交的更改或未提交的文件)
  • 您的项目文件位于标准位置(app/public/envspark
  • 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.emailuser.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更新但忘记先运行补丁的情况下可能会有所帮助。示例

  • 假设仓库处于较旧的状态并打补丁。

工作原理

补丁 是一个调用 gitcomposer 的 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 - 很可能您的项目使用以下典型“主”分支之一:developmainmaster

接下来要注意的是,可能导致冲突的最终合并阶段实际上是由一个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

支持

还需要帮助吗?

GitHub问题仅用于错误报告和功能请求。打开支持问题将被关闭,其作者会受到责难。