require の呼び出しを表示

ふと気になって、起動時になにがどういう順に require されてるのかを簡単に確認してました。
以下のようなコードをパスの通ったとこに用意しておいて、起動時のコマンドに挟み込みます。

  • show_require.rb
require 'rubygems'

module Kernel
  alias __require gem_original_require
  def gem_original_require(path)
    puts "#{path.ljust(30, " ")} from #{caller(1)[1]}"
    __require path
  end
  private :__require
  private :gem_original_require
end

load ARGV.shift

たとえば、AP4R の起動であれば、いつもは下記のような感じですが...、

% ruby186 script/mongrel_ap4r start -A config/queues_disk.cfg


それを次のようにします。

% ruby186 show_require.rb script/mongrel_ap4r start -A config/queues_disk.cfg


すると、require が呼ばれるごとに、なにが require されたのかと、どこから呼び出されたかが表示されます。

% ruby186 show_require.rb script/mongrel_ap4r start -A config/queues_disk.cfg
rubygems                       from ./script/mongrel_ap4r:1
ap4r                           from ./script/mongrel_ap4r:2
fileutils                      from /var/lib/gems/1.8/lib/rubygems.rb:340:in `ensure_gem_subdirectories'
etc                            from /usr/local/pkg/ruby-1.8.6/lib/ruby/1.8/fileutils.rb:973
fileutils                      from /var/lib/gems/1.8/lib/rubygems.rb:340:in `ensure_gem_subdirectories'
fileutils                      from /var/lib/gems/1.8/lib/rubygems.rb:340:in `ensure_gem_subdirectories'
fileutils                      from /var/lib/gems/1.8/lib/rubygems.rb:340:in `ensure_gem_subdirectories'
ap4r                           from ./script/mongrel_ap4r:2
rubygems                       from /var/lib/gems/1.8/gems/ap4r-0.3.7/lib/ap4r.rb:5
reliable-msg                   from /var/lib/gems/1.8/gems/ap4r-0.3.7/lib/ap4r.rb:6
reliable-msg/queue             from /var/lib/gems/1.8/gems/reliable-msg-1.1.0/lib/reliable-msg.rb:9
drb                            from /var/lib/gems/1.8/gems/reliable-msg-1.1.0/lib/reliable-msg/queue.rb:11
drb/drb                        from /usr/local/pkg/ruby-1.8.6/lib/ruby/1.8/drb.rb:1
socket                         from /usr/local/pkg/ruby-1.8.6/lib/ruby/1.8/drb/drb.rb:54
thread                         from /usr/local/pkg/ruby-1.8.6/lib/ruby/1.8/drb/drb.rb:55
fcntl                          from /usr/local/pkg/ruby-1.8.6/lib/ruby/1.8/drb/drb.rb:56
drb/eq                         from /usr/local/pkg/ruby-1.8.6/lib/ruby/1.8/drb/drb.rb:57
drb/drb                        from /usr/local/pkg/ruby-1.8.6/lib/ruby/1.8/drb/eq.rb:1
drb/invokemethod               from /usr/local/pkg/ruby-1.8.6/lib/ruby/1.8/drb/drb.rb:1562
reliable-msg/client            from /var/lib/gems/1.8/gems/reliable-msg-1.1.0/lib/reliable-msg/queue.rb:12
drb                            from /var/lib/gems/1.8/gems/reliable-msg-1.1.0/lib/reliable-msg/client.rb:11

  (snip)

** Starting AP4R Handler with config/queues_disk.cfg
Loaded queues configuration from: /Users/kiwamu/work/temp/my_ap4r/config/queues_disk.cfg
Using message store: memory
Accepting requests at: druby://localhost:6438

  (snip)
   

RubyGems の require でわらわら出るのもうざいので、require 'rubygems' のあとで require をひっかけるようにしています。caller のあたりはもうちょっとまともに書いたほうがいいかも... (^^;


ちなみに Rails だとこんな感じ。
あらためて見てみると、(同じものが何度も登場してるとはいえ) いろいろ require してますね...。

% ruby186 show_require.rb script/server
./script/../config/boot        from ./script/server:2
rubygems                       from ./script/../config/boot.rb:85:in `load_rubygems'
fileutils                      from /var/lib/gems/1.8/lib/rubygems.rb:340:in `ensure_gem_subdirectories'
etc                            from /usr/local/pkg/ruby-1.8.6/lib/ruby/1.8/fileutils.rb:973
fileutils                      from /var/lib/gems/1.8/lib/rubygems.rb:340:in `ensure_gem_subdirectories'
fileutils                      from /var/lib/gems/1.8/lib/rubygems.rb:340:in `ensure_gem_subdirectories'
fileutils                      from /var/lib/gems/1.8/lib/rubygems.rb:340:in `ensure_gem_subdirectories'
initializer                    from ./script/../config/boot.rb:55:in `load_initializer'
logger                         from /var/lib/gems/1.8/gems/rails-2.3.2/lib/initializer.rb:1
monitor                        from /usr/local/pkg/ruby-1.8.6/lib/ruby/1.8/logger.rb:4
set                            from /var/lib/gems/1.8/gems/rails-2.3.2/lib/initializer.rb:2
pathname                       from /var/lib/gems/1.8/gems/rails-2.3.2/lib/initializer.rb:3
railties_path                  from /var/lib/gems/1.8/gems/rails-2.3.2/lib/initializer.rb:6
rails/version                  from /var/lib/gems/1.8/gems/rails-2.3.2/lib/initializer.rb:7

  (snip) # 500行くらい

action_controller              from /var/lib/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:156:in `require'
dispatcher                     from /var/lib/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:156:in `require'
action_controller/dispatcher   from /var/lib/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:156:in `require'
rack/utils                     from /var/lib/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:156:in `require'
time                           from /var/lib/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:156:in `require'
rack/utils                     from /var/lib/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:156:in `require'
rack/mime                      from /var/lib/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:156:in `require'

=> Call with -d to detach
=> Ctrl-C to shutdown server