接手一个公司核心项目,初版代码是 2007 年开发的,用的是 Rails 1.X,没有测试也没有 Gemfile,代码量 2 万行不到。后端有其他语言逻辑(API),前端基于 Flex(也是 2007 年技术),所以只作中间层 API,使用 XML 通讯(以后可能会改 JSON,还没确定)。
现在公司打算重构到现代版本,升级到 Ruby 2 Rails 4,加入测试覆盖,以后可能会把 Flex 也换掉。
那么问题来了。应该如何逐步重构?(或者应该直接推翻了新建项目再移植原有功能?)
重构里面强调,如果差异很大,重写的代价低于重构,那么就应该重写。 测试用例应该是用新版本写,但是功能和测试数据基于老版本。
你可以这么想,就当作这个遗留版本是一份需求文档,现在你要用 Ruby 2 + Rails 4 开始开发它,就按照正常流程来。如果人手不够,要么延长交付时间,要么增加人手,如果两者都不行,那是管理的问题。
这篇文章 倒是写了 cookpad 是如何升级 ruby 跟 rails 的,虽然基本都是写如何升级 ruby 版本,Orz
升级 rails 它给的建议是,
一方、Rails のバージョンアップでは、バージョン間差異をモンキーパッチで吸収しにくい為、バージョン移行用のブランチ内で作業する必要があります (本稿で扱っているクックパッドは、Rails がバージョン 1 の頃のコードベースを使い続け、Rails のバージョンアップを何度か実施し、現在は Rails 3.2 系で運用しています)。
这是无责任简单翻译
但是一方面,对于 Rails 的版本升级,很难写出各版本差异之间的 monky patch,因此升级版本的时候需要在 branch 中进行(本文所涉及到的 cookpad 来说的话,Rails 在使用 version 1的代码的基础之上,重复了好几次Rails的版本升级,现在系统运行在Rails 3.2 上)
之前有 follow 一个老外的项目,该项目最初是基于 rails2.3 的,升级 rails 的步骤是 rails2.3 -> rails3.0 -> rails3.x -> rails4。。
我来说下我的方案吧,在两个以上的公司做过了。
比如要重构旧 Rails 1.x 上面的/users API:
这样无痛地慢慢地把原来 Rails 1.x API 移过来。
如果原来的 request 格式很难看(比如不是 Rails 那一套 RESTful 的风格),也可以在 nginx 里面进行改写。