【问题标题】:Gemfile is being loaded twice. Why? And how can I stop it?Gemfile 正在加载两次。为什么?我该如何阻止它?
【发布时间】:2012-07-28 09:41:22
【问题描述】:

我的 Gemfile 似乎加载了两次。当我运行 bundle install 我看到...

宝石文件:

source 'http://rubygems.org'


gem 'haml'                    # asset engine
gem 'jquery-rails'
gem 'rails',                  '= 3.1.1'
gem 'readable_exceptions'
gem 'sass-rails',             "= 3.1.4"  # asset engine
gem 'uglifier'                # asset engine
gem 'bundler',                ">= 1.0.18" # 1.0.18 is required for proper asset pipeline support
gem "rake", "=0.8.7"
gem "resque"
gem 'date_validator'
gem "typhoeus"
gem 'newrelic_rpm'
gem "scout_rails"
puts "Loading Gemfile"

输出:

Loading Gemfile
Loading Gemfile
Using rake (0.8.7) 
Using multi_json (1.3.6) 
Using activesupport (3.1.1) 

我相信这会导致我的开发环境出现问题,在该环境中,所有内容都被加载了两次。当我使用乘客独立运行服务器时,我有奇怪的日志,例如:

开发日志:

/app/models/facebook_application.rb:47: warning: already initialized constant APP_PROPERTIES
/app/models/facebook_application.rb:59: warning: already initialized constant ADJUSTABLE_MIGRATIONS
/app/models/facebook_application.rb:210: warning: already initialized constant MAX_TRIES

什么样的系统问题会导致所有内容都被加载两次?

我是:

  • 使用 RVM
  • 我已删除所有系统红宝石宝石
  • 使用捆绑器
  • 我已删除 .rvmrc 文件
  • 不使用 gemset
  • 使用 ruby​​-1.9.2-p320
  • 使用 rails 3.1.1

【问题讨论】:

    标签: ruby-on-rails ruby rvm bundler gemfile


    【解决方案1】:

    我遇到了同样的问题,这是由于 Dsl#eval_gemfile 从以下位置开始被调用两次引起的:

    1. https://github.com/bundler/bundler/blob/67320924db1f1910b17fae0a9268b02077874d26/lib/bundler/cli/install.rb#L60@bundler_version >= Gem::Version.new("1.14") 时为真)
    2. https://github.com/bundler/bundler/blob/67320924db1f1910b17fae0a9268b02077874d26/lib/bundler/cli/install.rb#L62

    这并不意味着您的 gem 被加载了两次(如前所述,它正在处理 Ruby 的 require 实现)。但是,当您尝试从 gemfile 打印一些信息时,这很烦人。

    如果您的问题与一次打印某些信息有关,那么解决方法可能是(没有更好的解决方法):

    if $YOUR_ONCE_CHECK.nil?
      puts "Doing it only once"
      $YOUR_ONCE_CHECK = true
    end
    

    我将在下面放置相应的堆栈跟踪以获取详细信息:

    gems/bundler-1.17.0/lib/bundler/dsl.rb:47:in `instance_eval'
    gems/bundler-1.17.0/lib/bundler/dsl.rb:47:in `eval_gemfile'
    gems/bundler-1.17.0/lib/bundler/plugin.rb:60:in `gemfile_install'
    gems/bundler-1.17.0/lib/bundler/cli/install.rb:60:in `run'
    gems/bundler-1.17.0/lib/bundler/cli.rb:235:in `block in install'
    gems/bundler-1.17.0/lib/bundler/settings.rb:143:in `temporary'
    gems/bundler-1.17.0/lib/bundler/cli.rb:234:in `install'
    gems/bundler-1.17.0/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
    gems/bundler-1.17.0/lib/bundler/vendor/thor/lib/thor/invocation.rb:126:in `invoke_command'
    gems/bundler-1.17.0/lib/bundler/vendor/thor/lib/thor.rb:387:in `dispatch'
    gems/bundler-1.17.0/lib/bundler/cli.rb:27:in `dispatch'
    gems/bundler-1.17.0/lib/bundler/vendor/thor/lib/thor/base.rb:466:in `start'
    gems/bundler-1.17.0/lib/bundler/cli.rb:18:in `start'
    gems/bundler-1.17.0/exe/bundle:30:in `block in <top (required)>'
    gems/bundler-1.17.0/lib/bundler/friendly_errors.rb:124:in `with_friendly_errors'
    gems/bundler-1.17.0/exe/bundle:22:in `<top (required)>'
    bin/bundle:23:in `load'
    bin/bundle:23:in `<main>'
    

    还有另一个电话:

    gems/bundler-1.17.0/lib/bundler/dsl.rb:47:in `instance_eval'
    gems/bundler-1.17.0/lib/bundler/dsl.rb:47:in `eval_gemfile'
    gems/bundler-1.17.0/lib/bundler/dsl.rb:12:in `evaluate'
    gems/bundler-1.17.0/lib/bundler/definition.rb:34:in `build'
    gems/bundler-1.17.0/lib/bundler.rb:135:in `definition'
    gems/bundler-1.17.0/lib/bundler/cli/install.rb:62:in `run'
    gems/bundler-1.17.0/lib/bundler/cli.rb:235:in `block in install'
    gems/bundler-1.17.0/lib/bundler/settings.rb:143:in `temporary'
    gems/bundler-1.17.0/lib/bundler/cli.rb:234:in `install'
    gems/bundler-1.17.0/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
    gems/bundler-1.17.0/lib/bundler/vendor/thor/lib/thor/invocation.rb:126:in `invoke_command'
    gems/bundler-1.17.0/lib/bundler/vendor/thor/lib/thor.rb:387:in `dispatch'
    gems/bundler-1.17.0/lib/bundler/cli.rb:27:in `dispatch'
    gems/bundler-1.17.0/lib/bundler/vendor/thor/lib/thor/base.rb:466:in `start'
    gems/bundler-1.17.0/lib/bundler/cli.rb:18:in `start'
    gems/bundler-1.17.0/exe/bundle:30:in `block in <top (required)>'
    gems/bundler-1.17.0/lib/bundler/friendly_errors.rb:124:in `with_friendly_errors'
    gems/bundler-1.17.0/exe/bundle:22:in `<top (required)>'
    bin/bundle:23:in `load'
    bin/bundle:23:in `<main>'
    

    【讨论】:

      【解决方案2】:

      这就是 Bundler 的工作方式。它执行一些检查以满足现有的依赖关系。 Bundler 在自己的 DSL 中运行 Gemfile 以获得依赖关系树。

      在 Ruby 级别禁止双重要求:第一个 require 加载文件,接下来的调用返回 false 表示该文件已经在聚会上,无需再次加载。所以我怀疑 Bundler 会导致你的错误。

      顺便说一句,您不必将bundle execrails 命令一起使用。 Rails 核心团队成员解释了here 原因。

      顺便说一句#2:install 是默认bundle 的行为。

      【讨论】:

        【解决方案3】:

        也许我遗漏了什么,但后面好像有一行 宝石“侦察轨” 它说 puts '加载 Gemfile'

        所以也许不是您要加载 Gemfile 两次(这实际上不会成为问题,因为我们可以捆绑安装一整天而不会损坏任何东西),但看起来您就是这样,因为您正在放置一个说明它的行。

        【讨论】:

        • 在 gemfile 中使用 puts 只是按照它说的做,它在终端中输出字符串......它不请求重新加载 Gemfile,这将是一个无限循环.. .
        猜你喜欢
        • 2012-09-29
        • 1970-01-01
        • 2014-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多