一次大型框架升级的AI协作样本:Claude Code参与7万行Django项目迁移

一位开发者用6个工作日,将约7万行代码的Django 3.2项目升级至Django 5.2 LTS。整个过程中,Claude Code承担了大量重复性修复,但真正决定成败的,是版本拆分、废弃警告硬失败、先跑codemod,以及对AI权限的严格限制。

一个约7万行代码的Django 3.2单体应用,在6个工作日内被升级到了Django 5.2 LTS。这次迁移并没有采用一步到位的跳跃式方案,而是由开发者将升级路径拆成多个版本节点,并让Claude Code承担其中大量重复性修复工作。整个过程中,真正关键的并不是某个巧妙的提示词,而是对AI能力边界的严格限制。

从Django 3.2到5.2:一次被拖延多年的升级

Django 3.2已于2024年4月结束生命周期,但该项目直到2026年仍停留在这个版本。原因并非团队不重视,而是升级任务本身过于沉重:从3.2到5.2之间横跨多个主要版本,每次有人打开升级工单,看到四个大版本的变更说明后,往往会选择暂时搁置。

项目还面临现实约束:开发者只有一个sprint的时间,且不能冻结功能开发。因此,升级必须以小型、可评审的PR形式持续合入,团队成员可以继续围绕这些分支并行开发。

在这种背景下,作者选择让已经用于日常重构的Claude Code参与这项多版本框架升级,核心问题不是AI能否写代码,而是它能否在有人设定规则的前提下,稳定完成长链路、重复性强的迁移任务。

拆版本、报废弃警告、先跑codemod

这次升级最重要的决策,是拒绝直接从Django 3.2跳到5.2。Django的废弃机制决定了:某个功能在X版本被标记弃用后,通常仍可继续工作到X+2;如果跨版本过大,原本能提示问题的警告会消失,最终只剩ImportError。

因此,升级路径被拆成多个阶段:

  • Django 3.2 + Python 3.9
  • Django 3.2 + Python 3.10
  • Django 4.2 LTS + Python 3.10
  • Django 4.2 LTS + Python 3.12
  • Django 5.2 LTS + Python 3.12

每一个阶段都是独立分支、独立通过CI、独立部署。Python和Django版本不会出现在同一个PR里,一旦测试环境出现问题,开发者可以立刻判断变量来自哪里。

同时,作者将Django默认通常不显眼的RemovedInDjangoXXWarning等废弃警告,转成测试中的硬性错误。这样一来,原本模糊的“升级Django”任务,被转化为一份具体、有限、带有堆栈信息的失败测试清单。这类任务恰好适合AI代理逐项消化。

对于第三方库产生的废弃警告,由于无法直接修改其源码,作者在测试设置中通过warnings.filterwarnings做了按模块屏蔽,确保项目自身代码仍保持严格要求。

在让Claude Code介入之前,作者还先运行了django-upgrade。这个确定性重写工具处理了大量机械性迁移,包括url()改re_path()、ugettext改gettext、request.is_ajax()替换、index_together调整等。一条命令就涉及约340个文件。

作者强调,这类工作先交给确定性工具更合适:成本更低、速度更快,也不会产生幻觉。AI应该把精力留给需要判断的部分,而不是做全局查找替换。

Claude Code的任务被压缩成一个“单调循环”

Claude Code收到的指令非常窄,接近一个固定流程:

  • 运行升级测试脚本
  • 只处理第一个失败测试
  • 阅读完整traceback和对应的Django发布说明
  • 做最小修复,不顺手重构周边代码
  • 重跑单个测试及对应模块测试
  • 以统一格式提交
  • 回到第一步

其中,“只处理第一个失败测试”这条规则显著降低了任务复杂度。如果放开限制,AI可能会面对上百个失败项,同时尝试修复几十个,最后生成难以评审的巨大diff;而在规则约束下,产出变成了连续的小提交,多数改动不超过20行。

另一条关键规则是“停止并询问”。当修复涉及设置默认值变更、迁移文件修改,或第三方包需要升级时,Claude Code必须停下来交由人类确认。这几类问题往往正是生产环境升级中最容易造成事故的位置。

依赖项是这次项目真正的进度风险。46个依赖包在动代码之前,先由Claude Code整理成一张表格,列出当前版本、是否支持Django 4.2、是否支持Django 5.2,以及后续动作。

最终盘点结果是:

  • 38个依赖只需升级版本
  • 5个依赖需要配置调整
  • 3个依赖需要替换或vendored处理

这张表让升级风险在第一天就被摊开。作者抽查了约三分之一条目,发现AI有两次错误判断,原因是它过于相信PyPI上的classifier信息。这也说明,即使Claude Code能完成大量信息整理,仍不能完全脱离人工核验。

AI编程进入大型重构流程的真实位置

从这次案例看,Claude Code在大型框架升级中的作用并不是“替人完成一切”,而是嵌入一条经过工程化设计的流程。它擅长消化明确、重复、带反馈闭环的任务,但在配置默认值、迁移文件、依赖生态判断等高风险环节,仍然需要人类开发者把关。

尤其值得注意的是,这次升级成功并不依赖某个聪明的prompt,而是依赖几个传统工程原则:逐版本迁移、让警告显性化、拆分PR、先跑确定性工具、限制AI的自由度。AI的价值,是在这些规则下持续稳定地执行。

对于很多长期停留在旧版本框架上的团队来说,这类实践提供了一种新的可能:大型重构不再只是靠人力硬扛,也可以被拆成可由AI协作完成的流水线任务。但前提也很明确——AI必须被放进严格约束的工作轨道里,而不是被赋予过多自主权。

原创文章,作者:点点,如若转载,请注明出处:https://www.dian8dian.com/yi-ci-da-xing-kuang-jia-sheng-ji-de-ai-xie-zuo-yang-ben

Like (0)
点点的头像点点
Previous 1小时前
Next 2025年9月26日

相关推荐