Gemfile正在加载两次。为什么?我怎么能阻止它?

时间:2012-07-30 17:12:33

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

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

的Gemfile:

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) 

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

development.log:

/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
  • 我删除了所有系统红宝石宝石
  • 使用bundler
  • 我删除了.rvmrc文件
  • 不使用gemset
  • 使用ruby-1.9.2-p320
  • 使用rails 3.1.1

3 个答案:

答案 0 :(得分:2)

也许我错过了一些东西,但看起来后面有一条线     宝石'scout-rails' 这说     把'加载Gemfile'

所以也许不是你加载你的Gemfile两次(实际上这不会是一个问题,因为我们可以整天捆绑安装而不会破坏任何东西),但它看起来像是因为你放了一个这句话说的。

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

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

  1. https://github.com/bundler/bundler/blob/67320924db1f1910b17fae0a9268b02077874d26/lib/bundler/cli/install.rb#L60(在@bundler_version >= Gem::Version.new("1.14")时为true)
  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>'