推进更新功能

This commit is contained in:
2023-09-19 18:08:47 +08:00
parent 56b706fe89
commit 8ed5a40147
7 changed files with 185 additions and 26 deletions

View File

@@ -8,10 +8,12 @@ use app\common\tools\PathTools;
use CzProject\GitPhp\Git;
use League\Flysystem\Filesystem;
use League\Flysystem\Local\LocalFilesystemAdapter;
use League\Flysystem\StorageAttributes;
use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\facade\App;
use think\facade\Env;
class Update extends Command
{
@@ -39,25 +41,40 @@ class Update extends Command
$version_file_regx = "/\bconst VERSION\s*=\s*'[\d\.a-z]+'/";
$last_version_git = new Git();
$output->writeln('下载最新代码');
$last_version_git = new Git();
$last_version_repo = $last_version_git->cloneRepository(self::REPO, $last_version_dir);
$last_version_file = $last_version_dir . '/app/common/command/admin/Version.php';
$last_version_str = file_get_contents($last_version_file);
preg_match($version_file_regx, $last_version_str, $matches);
$matched_version_str = $matches[0];
$tags = $last_version_repo->getTags();
$last_version = str_replace('const VERSION = ', '', $matched_version_str);
$last_version = str_replace('\'', '', $last_version);
$update_level = Env::get('adminsystem.update_level', 'production');
// if ($last_version == $current_version) {
// $output->writeln('当前代码为最新版本,无需更新');
// $this->cleanWorkpaceDir();
// return;
// }
if ($update_level == 'production') {
$tags = array_filter($tags, function ($value) {
if (strpos($value, '-')) {
return false;
}
// 将最新代码切换到最新版本
return true;
});
}
usort($tags, function ($a, $b) {
return version_compare($a, $b);
});
$last_version = $tags[count($tags) - 1];
if ($last_version == $current_version) {
$output->writeln('当前版本为最新版本');
$this->cleanWorkpaceDir();
return;
}
// 将最新代码切换到最新版本,因为最新的提交可能没有发布版本
$output->writeln('切换最新代码的最新版本');
$last_version_repo->checkout($last_version);
$current_version_git = new Git();
@@ -68,15 +85,66 @@ class Update extends Command
// 获取当前版本需要跳过的文件
$current_version_update_config = include $current_version_dir . '/config/update.php';
// 获取当前版本要替换的文件
// 获取当前版本要替换的文件
$current_version_filesystem = new Filesystem(new LocalFilesystemAdapter($current_version_dir));
$list_files = $current_version_filesystem->listContents('/', Filesystem::LIST_DEEP);
// dump($list_files);
$current_version_list_files = $current_version_filesystem->listContents('', Filesystem::LIST_DEEP)
->filter(function (StorageAttributes $attributes) use ($current_version_update_config) {
if ($attributes->isDir()) {
return false;
}
$path = $attributes->path();
$skip_files = $current_version_update_config['skip_files'] ?? [];
if (in_array($path, $skip_files)) {
return false;
}
$skip_dir = $current_version_update_config['skip_dir'] ?? [];
$skip_dir[] = '.git';
foreach ($skip_dir as $dir) {
if (str_starts_with($path, $dir)) {
return false;
}
}
return true;
})
->map(fn (StorageAttributes $attributes) => $attributes->path())
->toArray();
// 对比现在的代码,检查是否有定制修改
$output->writeln('对比源码是否被定制');
$now_dir = App::getRootPath();
$changed_files = [];
foreach ($current_version_list_files as $file_path) {
$now_file_path = $now_dir . '/' . $file_path;
$current_version_file_path = $current_version_dir . '/' . $file_path;
if (!PathTools::compareFiles($now_file_path, $current_version_file_path)) {
$changed_files[] = $file_path;
}
}
// 有定制修改则退出
if (!empty($changed_files)) {
$output->warning('无法自动更新,以下文件被定制,请还原或手动升级:');
foreach ($changed_files as $file_path) {
$output->warning($file_path);
}
return;
}
// 获取最新版本需要跳过的文件
// 获取最新版本要替换的文件

View File

@@ -14,7 +14,7 @@ use think\facade\App;
class Version extends Command
{
public const VERSION = 'v2.0.30-beta';
public const VERSION = 'v2.0.30-dev';
public const LAYUI_VERSION = '2.8.16';