将Rails 2应用程序移植到新服务器

时间:2010-09-16 17:52:42

标签: ruby-on-rails ruby rubygems porting freeze

我在这个过程中发布了其他几个问题,但我更清楚自己要做什么,所以我想我会问这个问题。

我继承了一个Rails 2.2.2应用程序,该应用程序目前以生产形式在我有权访问的服务器上运行。我正在尝试将该应用程序移植到我的服务器,版本控制等。我首先尝试复制源代码并使其在Rails 3和最新版本的gem下运行,但事实证明这比我以为会是。似乎最好的解决方案是简单地使用当前系统正在使用的相同版本的Rails和其他gem,并按原样移植到应用程序。

所以我想知道最好的方法是什么?我可以将源代码放入我的版本控制系统中,并以与现在相同的方式设置Capistrano和Passenger。问题是在同一版本中获取所有宝石。我听说过冻结Rails和冻结宝石,但很多关于它的教程看起来有点过时了。在当前正在运行的生产服务器上冻结gem是否安全,或者我应该只获取gems及其版本的列表并在我将移植到的新服务器上手动安装它们?

编辑:我遵循了tadman的建议并设置了一个Gemfile,其中包含生产服务器上安装的所有gem和最新版本,但现在我已经遇到了版本混乱,例如:

Bundler could not find compatible versions for gem "ruby2ruby":
  In Gemfile:
    merb-action-args (= 1.0.8.1) depends on
      ruby2ruby (>= 1.1.9)

    ambition (= 0.5.4) depends on
      ruby2ruby (1.1.8)

生产服务器有时安装了多达4个版本的同一个gem,但Bundler似乎只想处理每个版本的一个版本。有没有一种简单的方法来解决这样的情况,还是回到生产中寻找冻结的宝石?

编辑2:我最后删除了所有gems中的版本,除了rails并执行bundle install。到目前为止,即使所有版本都不完全匹配,它似乎仍然有效。

1 个答案:

答案 0 :(得分:1)

切换到Rails 3可能是一个严重的问题,但打包宝石的历史版本可能会非常容易。在某种程度上,bundler可以使您更容易,您可以在Gemfile中为您的应用程序声明所需的特定版本。虽然这是Rails 3中使用的事实上的方法,但它与平台无关,可以在任何版本的Rails上用作分发机制。

您通常可以确定与gem list一起使用的宝石版本,除非config/environment.rb中另有说明,否则会自动选择最新版本。可以很容易地将宝石列表转换为Gemfile