【问题标题】:Problem deploying frozen Rails app - "could not find RubyGem rack"部署冻结的 Rails 应用程序时出现问题 - “找不到 RubyGem 机架”
【发布时间】:2010-08-18 15:08:30
【问题描述】:

我有一个 Rails 应用程序,我在 Windows 上使用 Rails 2.3.5 开发,使用 sqlite3 作为我的数据库引擎,内部 Mongrel 服务器作为我的网络服务器。

我将此应用程序部署到运行 Rails 2.1.0 的托管 Linux 机器上,使用 Postgres 作为我的数据库,并使用 Apache(调用 dispatch.cgi)作为我的网络服务器。我无权更新本机 Ruby 或 Rails 安装,或本机安装 gem。

为了使我的部署更容易(我想...),我为部署的系统采用了我的代码库的一个分支。在这个分支上,我更新了 database.yml 以引用 postgres 并运行 rake rails:freeze:gemsrake 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

)

【问题讨论】:

    标签: ruby-on-rails deployment rubygems


    【解决方案1】:

    Rack 不包括在内,因为它是一个框架 gem。要出售此 gem,您可以手动将其解压缩到 vendor/gems 中,如下所示:

    cd vendor/gems; gem unpack rack -v="1.0.1"

    您也可以开始使用bundler 来管理您的依赖项,正如 Rails 现在在第三版中默认使用的那样,以避免出现您当前遇到的问题。

    【讨论】:

    • 啊,这肯定有帮助,但我们还没有做到。首先,我还必须 rake gems:refresh_specs,它会加载 Rack。我现在收到以下错误:/var/www/chowlett/dominion_frozen/vendor/rails/activesupport/lib/active_support/whiny_nil.rb:52:in method_missing': undefined method env_table' for nil:NilClass (NoMethodError) from /var /www/chowlett/dominion_frozen/vendor/rails/actionpack/lib/action_controller/cgi_process.rb:22:in `__send__' 如果不相关,请告诉我,我会提出一个新问题。
    • 没关系,这最后一个似乎是 Debian 下的 Apache 的问题,并且不使用Passenger。如果需要,我会尝试解决它并提出一个新问题。
    【解决方案2】:

    您的第一个问题是 Rails 2.1.0 没有使用 Rack 作为中间层。

    您还需要在 config/environment.rb 文件中更改 rails 版本。

    此外,根据您使用的其他 gem,您可能需要返回到可与 2.1.0 一起使用的稳定版本。

    就我个人而言,我会在我的本地机器上安装 2.1.0 使用该 rails 版本创建一个新应用程序,从 2.3.5 项目复制应用程序文件夹(当然还有你的单元测试和公共文件夹等,然后查看如果你能让它在你的本地机器上运行在 2.1.0 下,在你去的时候替换那些在服务器日志或浏览器中的回溯中失败的 gem。这将比在生产模式下运行并查看 apache 容易得多假设你有很好的单元测试来渲染你的所有视图并调整你的模型代码,那么你应该很快清除你使用的任何方法,这些方法是从 2.1.0 开始添加的,这些方法在旧版本的 Rails 中不受支持。

    【讨论】:

    • 谢谢,我以后可能会这样做。目前,冻结 Rack 似乎已经解决了下一个已知错误,为此我需要对我的系统管理员微笑以安装和配置Passenger。
    猜你喜欢
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 2020-10-22
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    相关资源
    最近更新 更多