【问题标题】:Rails 2.x mongrel won't start after upgrading to rails 3. -- mongrel_rails (MissingSourceFile)Rails 2.x mongrel 升级到 rails 3 后不会启动。 -- mongrel_rails (MissingSourceFile)
【发布时间】:2011-07-10 19:54:32
【问题描述】:

在 OS X 上将我的 Rails 安装升级到 Rails 3 后,我在使用 Mongrel 运行 Rails 2.x 开发站点时遇到了问题。 WEBrick 似乎可以工作,但我真的很想得到 Mongrel 的良好输出来进行调试。

在运行$ script/server 之后,我明白了:

/Library/Ruby/Gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:489:in `load': no such file to load -- mongrel_rails (MissingSourceFile)
from /Library/Ruby/Gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:489:in `load'
from /Library/Ruby/Gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:342:in `new_constants_in'
from /Library/Ruby/Gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:489:in `load'
from /Library/Ruby/Gems/1.8/gems/rails-2.0.2/lib/commands/servers/mongrel.rb:64
from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:49:in `gem_original_require'
from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:49:in `require'
from /Library/Ruby/Gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:496:in `require'
from /Library/Ruby/Gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:342:in `new_constants_in'
from /Library/Ruby/Gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:496:in `require'
from /Library/Ruby/Gems/1.8/gems/rails-2.0.2/lib/commands/server.rb:39
from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:49:in `gem_original_require'

到目前为止,这是我尝试过的:

$ sudo gem update system
$ sudo gem update
$ sudo gem uninstall mongrel
$ sudo gem install mongrel --include-dependencies
$ which mongrel_rails

/usr/bin/mongrel_rails

$ mongrel_rails start

→ 成功,但没有标准输出

$ which mongrel_rails

/usr/bin/mongrel_rails

$ rails _2.0.2_ test

→ 新应用也有同样的问题。

  • 操作系统:OS X.6.x
  • Rails:3.0.5(Rails 2.x 应用程序存在问题)
  • gem -v:1.6.1
  • 杂种:杂种 (1.1.5)

我已经阅读了关于“-- mongrel_rails (MissingSourceFile)”的所有 Google 结果;数量不多。

这里有人能告诉我如何继续调试吗?谢谢!

更新:

我现在尝试安装旧版本的 gem 并在我的 Rails 2.x 站点的 config/environment.rb 文件中指定它们。我试过 1.1.5、1.1.4 和 1.2.0pre。

这些都没有丝毫区别。

自从usr/bin 中的可执行文件以来,我想知道这是否是文件所有权问题在我的 Rails 3 安装中搞砸了,是否其中一个文件在运行时没有获得我的路径?

/Library/Ruby/Gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb 归 admin / root 所有,所以应该没问题吧?

会不会是 active_support 的问题!?

这是来自dependencies.rb 的引发错误的代码:

484 class Object
485   
486  alias_method :load_without_new_constant_marking, :load
487  
488  def load(file, *extras) #:nodoc:
489    Dependencies.new_constants_in(Object) { super(file, *extras) }
490  rescue Exception => exception  # errors from loading file
491     exception.blame_file! file
492     raise
493   end
...  

这是一个找不到文件的错误,所以它没有查看我知道文件的位置...... 在命令行上运行 mongrel_rails 可以工作…… 其中 mongrel_rails 在usr/bin 中显示它, 那么有什么问题呢?

【问题讨论】:

    标签: ruby-on-rails macos mongrel


    【解决方案1】:

    我肯定会考虑使用 RVM 在本地同时运行多个 gem 版本。当我尝试运行多个版本时,我遇到了很多怪癖,就像您使用 sudo gem 安装所有内容一样。

    现在就像rvm ree@my_app_1 一样简单,在那里安装完全独立的gem,然后切换到不同的应用程序并使用rvm ree@my_app_2

    ree 是我安装 ruby​​ 企业版的别名,您可以使用 ruby​​ 1.9、1.8.x 等轻松完成。

    在我的每个应用程序的根目录中,我都有一个 .rvmrc 文件,其内容简单:

    rvm ree@my_app --create
    

    这样每次我切换到该目录时,gemset 都会自动为我交换。

    【讨论】:

    • 一个好主意...但我真的希望只是解决问题而不是安装更多的东西。如果没有其他办法,我可能不得不这样做,但我宁愿避免它,因为这是我目前唯一遇到的宝石问题......不过有一个后备方案很好!
    • 是的,看起来这不是 RVM 会解决的问题。
    • 出于其他原因安装 RVM 是个好主意,但这并不能解决问题。
    【解决方案2】:

    我不知道有 Rails 3 mongrel 支持。

    大多数人都使用 Thin(您可以通过在 Gemfile 中指定 gem 'thin' 来启用它,然后启动 rails server thin / Webrick。

    如果这是用于托管,那么 nginx 和Passenger 会提供帮助。

    【讨论】:

    • 再一次,我的问题不在于 rails 3,而是在安装 rails 3 后启动我的 rails 2 应用程序。
    【解决方案3】:

    好的,这是一个答案。我得到了 mongrel 启动...但它很 hacky,并不能解决真正的问题...但至少现在我可以重新开始这个项目。

    这就是我所做的......是的..这是 HACKY。

    我编辑了抛出错误的文件...dependencies.rb

    我添加了一个钩子来调用 mongrel rails 的特定路径,如果那是它试图加载的文件。

    def load(file, *extras) #:nodoc:
    
    if file == "mongrel_rails"
      file ="/usr/bin/mongrel_rails"
    end
    Dependencies.new_constants_in(Object) { super(file, *extras) }
      rescue Exception => exception  # errors from loading file
      exception.blame_file! file
      raise
    end
    

    再次,我真的很想解决这里的根本问题......但这至少让我启动。

    【讨论】:

      【解决方案4】:

      我也遇到了同样的问题,找到原因了。

      发生这种情况是因为新版本的 RubyGems(1.6.2) 在您需要“any_gem”时不会将“any_gem/bin”添加到 ruby​​ 加载路径 ($LOAD_PATH)。

      例如,在 RubyGems 版本 = 1.4.1 中,这可以正常工作。在我需要 'mongrel' 之后,我可以在下一个加载路径中看到:

      • ...rvm/gems/ruby-1.8.7-p330/gems/mongrel-1.1.5/bin
      • ...rvm/gems/ruby-1.8.7-p330/gems/mongrel-1.1.5/lib
      • ...rvm/gems/ruby-1.8.7-p330/gems/mongrel-1.1.5/ext

      使用新版本 (1.6.2) 我只能看到:

      • ...rvm/gems/ruby-1.8.7-p330/gems/mongrel-1.1.5/lib
      • ...rvm/gems/ruby-1.8.7-p330/gems/mongrel-1.1.5/ext

      这就是 ruby​​ 找不到“mongrel_rails”的原因。

      【讨论】:

      【解决方案5】:

      我遇到了同样的问题——通过从项目目录(而不是“脚本/服务器”)运行“mongrel_rails”来运行我的应用程序。

      【讨论】:

      • 是的,如果您更仔细地查看我的帖子,您会发现我确实尝试过。它运行了,但没有输出到控制台...
      【解决方案6】:

      这是您能够找到 mongrel_rails (MissingSourceFile) 错误的最佳答案的线程。我只想在这里总结一下我是如何解决这个问题的,使用这个线程中的东西。

      我能想到的最简单的解决方案是通过键入来降级 RubyGems

      (sudo) gem update --system 1.4.1
      

      这让我可以运行旧的 2.1.0 应用程序(感谢 Max Shytikov),但运行旧版本的 ruby​​gems 可能会丢失很多错误修复。该错误可能是杂种 gem 开发人员的错误(我猜)。

      无论如何,如果您只想使用 mongrel 运行您的应用程序,请这样做。如果您坚持使用最新版本的 ruby​​gems,您可以运行您的应用程序

      script/server webrick
      

      但是我发现 webrick 有点慢,所以我更喜欢 mongrel。如果有人对此问题有更好的解决方案,请告诉我。

      【讨论】:

      • 如果您阅读以上内容,我确实找到了几个我更喜欢运行 webrick 的解决方案: 1. 从项目根目录运行“mongrel_rails start”。它会运行,但你不会得到我在开发过程中觉得很好的通常反馈。 2. 看看我的“hack”,它运行起来了。我刚刚修改了一个 rails 文件并添加了一个钩子以通过正确的路径显式加载 mongrel。我选择的答案中的代码。
      【解决方案7】:

      您需要在加载路径中添加“/usr/bin”。也许里面有什么东西坏了?

      修复它的最佳方法是添加:

      $:.push("/usr/bin/")
      

      在它破裂之前的某个地方。如果您没有,可能单独在 config/preinitializer.rb 文件中。

      【讨论】:

      • 这很完美,不需要我的破解。谢谢!
      • 对于那些难以理解这个答案的人(因为它显然是最好的,恕我直言),这只涉及将提到的文件添加到应用程序的配置目录中。一行,在应用程序中,一切都在本地和远程运行良好。
      【解决方案8】:

      我遇到了同样的错误。解决方法是将杂种“bin”目录添加到 $LOAD_PATH。其他帖子描述了如何通过修改源代码来做到这一点,但由于我与其他开发人员共享源代码,我更喜欢设置 RUBYLIB 环境变量。

      $ export RUBYLIB=/Users/edwingo/.rvm/gems/ruby-1.8.7-p302@junction/gems/mongrel-1.1.5/bin
      

      这会导致 MRI ruby​​ 运行时将其添加到 $LOAD_PATH。

      详细说明:MRI 无法找到“mongrel_rails”,因为它不在 $LOAD_PATH 上。我正在使用 RVM,当我将 mongrel 安装到 gemset 中时,由于某种原因,$LOAD_PATH 不包含“mongrel_rails”所在的相应“bin”目录。当使用 RVM 并且在将 mongrel 安装到系统 gem 之后,“bin”目录确实出现在 $LOAD_PATH 上,所以一切正常。

      【讨论】:

      • 您在何时何地进行设置?在控制台中?另外...我有这个问题,我没有使用 RVM。
      • @Techism,我在运行 mongrel 的命令行上使用命令 script/server 设置了环境变量。
      • 谢谢 Edwin,我得测试一下!
      猜你喜欢
      • 2011-09-18
      • 2012-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 2017-02-11
      相关资源
      最近更新 更多