dansan / php-backport
一个简单的php回滚模块
Requires
- php: >=7.1
- nikic/php-parser: ^4.2
- symfony/finder: *
Requires (Dev)
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 的较新版本 - 在
Beta
和Gamma
中放弃 PHP 7.2 的功能 - 为所有其他项目保留 PHP 7.2 的功能,但为
Beta
和Gamma
编写回滚脚本
我们选择了最后一个选项,因为它比其他选项更具侵入性和可控性,并且显然更方便。
我们找到了一个名为 nikic/php-parser 的库,它允许通过编写 visitor 来解析 PHP 源代码并干预其 AST。
因此,我们可以回滚 PHP 7.0 不支持的功能(或更确切地说,是我们用于 Beta
和 Gamma
的那些功能)。
使用方法
想法是,在 Beta
和 Gamma
上继续在 master
分支上的常规开发。
一旦测试通过并且打算将 Beta
和 Gamma
的 master
分支的新版本用于 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
或功能分支或开发分支上执行回滚。
下面是一个如何配置 Beta
的 bin/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";
此回滚脚本会回滚 src
和 tests
目录,然后更新 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 镜像。