在 PHP 7.4 中,基于语义化版本的目录名称,从低到高逐一执行目录中的脚本文件

1、现阶段目录列表如下:v2.0.15-rc.6、v2.0.15-rc.7、v2.0.15、v2.0.16-hotfix.2、v2.0.16-hotfix.3、v2.0.16、v2.0.17-rc.0、v2.0.20。如图1

图1

2、获取给定目录的所有子目录,将 glob() 与 GLOB_ONLYDIR 选项一起使用。

$directories = glob(module_path('ThemeStoreDB') . '/Resources/setting_migrations' . '/*' , GLOB_ONLYDIR);
print_r($directories);
exit;

3、打印结果如下,符合预期。如图2

图2

Array
(
    [0] => E:\wwwroot\object\Modules/ThemeStoreDB/Resources/setting_migrations/v2.0.15
    [1] => E:\wwwroot\object\Modules/ThemeStoreDB/Resources/setting_migrations/v2.0.15-rc.6
    [2] => E:\wwwroot\object\Modules/ThemeStoreDB/Resources/setting_migrations/v2.0.15-rc.7
    [3] => E:\wwwroot\object\Modules/ThemeStoreDB/Resources/setting_migrations/v2.0.16
    [4] => E:\wwwroot\object\Modules/ThemeStoreDB/Resources/setting_migrations/v2.0.16-hotfix.2
    [5] => E:\wwwroot\object\Modules/ThemeStoreDB/Resources/setting_migrations/v2.0.16-hotfix.3
    [6] => E:\wwwroot\object\Modules/ThemeStoreDB/Resources/setting_migrations/v2.0.17-rc.0
    [7] => E:\wwwroot\object\Modules/ThemeStoreDB/Resources/setting_migrations/v2.0.20
)

4、需要针对目录重新排序(仅获取最后一级目录)。打印结果,如图3

图3

$directories = glob(module_path('ThemeStoreDB') . '/Resources/setting_migrations' . '/*' , GLOB_ONLYDIR);
print_r(array_map(fn($directory): string => pathinfo($directory)['basename'], $directories));
// print_r($directories);
exit;
Array
(
    [0] => v2.0.15
    [1] => v2.0.15-rc.6
    [2] => v2.0.15-rc.7
    [3] => v2.0.16
    [4] => v2.0.16-hotfix.2
    [5] => v2.0.16-hotfix.3
    [6] => v2.0.17-rc.0
    [7] => v2.0.20
)

5、目录顺序不正确,usort — 使用用户自定义的比较函数对数组中的值进行排序。version_compare — 对比两个「PHP 规范化」的版本数字字符串。排序符合预期。如图4

图4

$directories = glob(module_path('ThemeStoreDB') . '/Resources/setting_migrations' . '/*' , GLOB_ONLYDIR);
$versions = array_map(fn($directory): string => pathinfo($directory)['basename'], $directories);
usort($versions, 'version_compare');
// print_r(array_map(fn($directory): string => pathinfo($directory)['basename'], $directories));
print_r($versions);
exit;
Array
(
    [0] => v2.0.15-rc.6
    [1] => v2.0.15-rc.7
    [2] => v2.0.15
    [3] => v2.0.16-hotfix.2
    [4] => v2.0.16-hotfix.3
    [5] => v2.0.16
    [6] => v2.0.17-rc.0
    [7] => v2.0.20
)

6、当版本 v2.0.15 升级至 v2.0.17-rc.0 时,其需要执行的目录为:v2.0.16-hotfix.2、v2.0.16-hotfix.3、v2.0.16、v2.0.17-rc.0。先过滤,再排序。最终实现如下。如图5

图5

$directories = glob(module_path('ThemeStoreDB') . '/Resources/setting_migrations' . '/*', GLOB_ONLYDIR);
$versions = array_map(fn($directory): string => pathinfo($directory)['basename'], $directories);
$fromVersion = 'v2.0.15';
$toVersion = 'v2.0.17-rc.0';
$pendingVersions = array_filter($versions, function ($v) use ($fromVersion, $toVersion) {
 return version_compare($v, $fromVersion, '>') && version_compare($v, $toVersion, '<=');
});
usort($pendingVersions, 'version_compare');
print_r($pendingVersions);
exit;
Array
(
    [0] => v2.0.16-hotfix.2
    [1] => v2.0.16-hotfix.3
    [2] => v2.0.16
    [3] => v2.0.17-rc.0
)

永夜

View Comments