feat(update): composer.json 智能对比输出具体命令

This commit is contained in:
augushong
2026-05-25 21:38:58 +08:00
parent a17ba88068
commit 65b196e768

View File

@@ -341,15 +341,8 @@ class AdminUpdateServiceBase
$output->writeln("统计: 新增 {$add_count}, 删除 {$delete_count}, 更新 {$update_count}");
}
// 检测now的composer依赖和最新的composer依赖
$last_composer_json = file_get_contents($last_version_dir . '/composer.json');
$output->writeln($last_composer_json);
$output->writeln('请参考以上最新composer文件调整您的依赖');
// 分析出最新需要的但now没有的
// 为用户整理出要手动调整的composer命令
// 对比 composer.json 依赖差异
$this->compareComposerRequire($current_version_dir, $last_version_dir, $output);
$output->writeln('更新完成');
// 更新完成
@@ -486,4 +479,65 @@ class AdminUpdateServiceBase
}
closedir($handle);
}
protected function compareComposerRequire(string $current_dir, string $last_dir, Output $output): void
{
$current_composer_path = $current_dir . '/composer.json';
$last_composer_path = $last_dir . '/composer.json';
if (!file_exists($last_composer_path)) {
return;
}
$last_composer = json_decode(file_get_contents($last_composer_path), true);
$current_composer = file_exists($current_composer_path)
? json_decode(file_get_contents($current_composer_path), true)
: [];
if (!$last_composer || !is_array($last_composer)) {
return;
}
$last_require = $last_composer['require'] ?? [];
$current_require = ($current_composer && is_array($current_composer))
? ($current_composer['require'] ?? [])
: [];
if (empty($last_require) && empty($current_require)) {
return;
}
$output->writeln('');
$output->writeln('Composer 依赖变更:');
$has_changes = false;
// 新增的依赖
$new_packages = array_diff_key($last_require, $current_require);
foreach ($new_packages as $package => $version) {
$output->writeln(" composer require {$package}:{$version}");
$has_changes = true;
}
// 删除的依赖
$removed_packages = array_diff_key($current_require, $last_require);
foreach ($removed_packages as $package => $version) {
$output->writeln(" composer remove {$package}");
$has_changes = true;
}
// 版本变更的依赖
$common_packages = array_intersect_key($last_require, $current_require);
foreach ($common_packages as $package => $last_version) {
$current_version = $current_require[$package];
if ($current_version !== $last_version) {
$output->writeln(" composer require {$package}:{$last_version} (版本变更, 旧版: {$current_version})");
$has_changes = true;
}
}
if (!$has_changes) {
$output->writeln(' composer 依赖无变化');
}
}
}