dansan/php-backport

一个简单的php回滚模块

dev-master / 0.0.x-dev 2020-03-29 10:48 UTC

This package is auto-updated.

Last update: 2024-09-29 05:09:25 UTC


README

入门

composer requre dansan/php-backport --dev

backport.php 文件写入源目录以回滚。

<?php
// bin/backport.php
require __DIR__.'/../vendor/autoload.php';

$client = new \BackPort\Client();
$client
    ->setDirsToPort([
        __DIR__.'/../src',
    ])
    ->execute()
;
echo "DONE\n";

*_bp 分支上,运行回滚脚本 backport.php,提交并推送。

git branch master_bp
git checkout master_bp
php bin/backport.php
git add .
git commit -m "backport"
git push origin master_bp

在需要回滚版本模块的项目中的 composer.json 中

    ...
    "require": {
        ...
        "acme/my-module": "dev-master_bp@dev",
        ...
    }
    ...

开发

开始前,请先克隆并启动项目,然后运行测试。

git clone <url> <project_dir>
cd <project_dir>
./dc up -d
./dc enter
test

在执行 ./dc up -d 之前,最好先执行 cp .env.dist .env 并适当修改 .env

什么是

此模块用于将 PHP 7.0 的某些功能回滚到使用的模块中。

这种需求是在我们完成了一个名为(称为 Gammma)的模块后,在 PHP 7.2 中意识到,我们需要在其中一个应用程序上使用它(称为 Alpha),它最多依赖于 PHP 7.0。

此外,这种依赖是通过一个中间模块(称为 Beta)实现的。

component Gamma
component Beta
component Alpha

Alpha ..> Beta
Beta ..> Gamma
Alpha ..> Gamma

我们面临的选项包括:

  • Alpha 迁移到依赖 PHP >=7.2 的较新版本
  • BetaGamma 中放弃 PHP 7.2 的功能
  • 为所有其他项目保留 PHP 7.2 的功能,但为 BetaGamma 编写回滚脚本

我们选择了最后一个选项,因为它比其他选项更具侵入性和可控性,并且显然更方便。

我们找到了一个名为 nikic/php-parser 的库,它允许通过编写 visitor 来解析 PHP 源代码并干预其 AST。

因此,我们可以回滚 PHP 7.0 不支持的功能(或更确切地说,是我们用于 BetaGamma 的那些功能)。

使用方法

想法是,在 BetaGamma 上继续在 master 分支上的常规开发。

一旦测试通过并且打算将 BetaGammamaster 分支的新版本用于 Alpha,我们就切换到 master_bp 分支并尝试与 master 合并。

git checkout master_bp
git merge master

通常会出现冲突。

通过接受来自 master 的所有内容来解决冲突

使用 PHPStorm,只需执行 Git -> Resolve Conflicts,选择所有内容并选择 Accept Theirs 即可。

由于这是完全派生的代码,因此如果怀疑有问题,也可以删除 master_bp 并从头开始创建。

git checkout master
git branch -D master_bp
git push -d origin master_bp
git checkout master_bp

一旦解决冲突或重新生成分支,就必须运行回滚脚本。

php bin/backport.php

bin/backport.php 脚本非常简单,易于修改和理解,因为它使用了 Dan/Backport 提供的客户端。但是,每个仓库都必须定义自己的 bin/backport.php

如果不在带有 _bp 后缀的分支上,则脚本会阻止执行,以避免在 master 或功能分支或开发分支上执行回滚。

下面是一个如何配置 Betabin/backport.php 的示例

<?php
// bin/backport.php
require __DIR__.'/../vendor/autoload.php';

$client = new \BackPort\Client();
$client
    ->setProjectDir(__DIR__.'/..')
    ->setDirsToPort([
        __DIR__.'/../src',
        __DIR__.'/../tests'
    ])
    ->addComposerJsonReplacement('/"acme\/gamma": "[^@]+@dev"/', '"acme/gamma": "dev-master_bp@dev"')
    ->execute()
;
echo "DONE\n";

此回滚脚本会回滚 srctests 目录,然后更新 composer.json,使 Beta 依赖于 Gamma 的 master_bp 分支而不是当前分支。

回滚完成后,执行 composer update,运行测试,提交并推送。

composer update
test
git add .
git commit -m "backport"
git push origin master_bp

如果我们已经回滚了 Gamma,则此时可能需要切换到 Beta 并执行相同的步骤。

接下来需要在 Alpha 上执行 composer update

总结一下

Alpha 依赖于

  • "php": "7.0"
  • "acme/beta": "dev-master_bp@dev"
  • "acme/gamma": "dev-master_bp@dev"

Beta

  • master 分支中依赖于
    • "php": ">=7.2"
    • "acme/gamma": "dev-master@dev",
  • 而在 master_bp 分支中依赖于
    • "php": ">=7.0"
    • "acme/gamma": "dev-master_bp@dev",

Gamma

  • master 分支中依赖于
    • "php": ">=7.2"
  • master_bp 分支中依赖于
    • "php": ">=7.0"

以及 backport 脚本帮助保持这些并行依赖的一致性。

致谢

感谢 Matiux 为项目提供的 Docker 镜像。