我有一个rails应用程序,我在Windows上使用Rails 2.3.5开发,使用sqlite3作为我的数据库引擎,内部Mongrel服务器作为我的web服务器。
我将此应用程序部署到运行Rails 2.1.0的托管Linux计算机上,使用Postgres作为我的数据库,Apache(调用dispatch.cgi)作为我的网络服务器。我无权更新本机Ruby或Rails安装,或本机安装gem。
为了使我的部署更容易(我想......),我为已部署的系统采用了代码库的一个分支。在这个分支上,我更新了database.yml以引用postgres并运行rake rails:freeze:gems
和rake gems:unpack:dependencies
。然后我将此分支导出到我的生产服务器。
当我尝试在生产服务器上查看我的应用时,出现错误:
Application error
Rails application failed to start properly"
检查Apache错误日志,我看到以下内容:
./../config/../vendor/rails/railties/lib/initializer.rb:271:in `require_frameworks': Could not find RubyGem rack (~> 1.0.1) (RuntimeError)
from ./../config/../vendor/rails/railties/lib/initializer.rb:134:in `process'
from ./../config/../vendor/rails/railties/lib/initializer.rb:113:in `send'
from ./../config/../vendor/rails/railties/lib/initializer.rb:113:in `run'
from ./../config/environment.rb:9
from dispatch.cgi:5:in `require'
from dispatch.cgi:5
我很困惑。如果需要Rack,为什么gems:unpack
不包含它?我怎样才能使这个工作?
(如果相关,vendor$ find . -name rack*
给出以下内容:
./rails/railties/lib/rails/rack
./rails/railties/lib/rails/rack.rb
./rails/railties/lib/rails/.svn/text-base/rack.rb.svn-base
./rails/actionpack/test/controller/rack_test.rb
./rails/actionpack/test/controller/.svn/text-base/rack_test.rb.svn-base
./rails/actionpack/lib/action_controller/rack_lint_patch.rb
./rails/actionpack/lib/action_controller/.svn/text-base/rack_lint_patch.rb.svn-base
)
答案 0 :(得分:4)
Rack不包含在内,因为它是一个框架宝石。要提供此gem,您可以手动将其解压缩到这样的供应商/宝石中:
cd vendor/gems; gem unpack rack -v="1.0.1"
您也可以开始使用bundler来管理您的依赖项,因为Rails现在默认在版本3中执行,以避免出现您当前遇到的问题。
答案 1 :(得分:0)
你的第一个问题是Rails 2.1.0不使用Rack作为中间层。
您还需要更改config / environment.rb文件中的rails版本。
此外,根据您使用的其他宝石,您可能需要返回适用于2.1.0的稳定版本。
就个人而言,我会在我的本地机器上安装2.1.0创建一个带有rails版本的新应用程序,从2.3.5项目复制app文件夹(当然还有你的单元测试和公共文件夹等,看看如果你可以让它在本地机器上运行2.1.0,那么在服务器日志或浏览器中的回溯失败时替换gems。这比在生产模式下运行并查看apache要容易得多假设您有良好的单元测试来渲染所有视图并展示您的模型代码,那么您应该清除掉自2.1.0以来添加的任何方法,这些方法很快就会在旧版本的Rails中得不到。