From: Tanaka Akira Date: 2004-01-29T15:24:16+09:00 Subject: [ruby-dev:22765] Re: $: trick in test/* In article <03fe01c3e62e$9591cbb0$93222fc0@sarion.co.jp>, "NAKAMURA, Hiroshi" writes: > なひです。 > > 背景) 現在/src/ruby/test/*のテストケースにはいくつか、$:をいじって、 > カレントディレクトリのファイルをrequireできるようにしている > ものがあります。test/rss/*で > require 'common' > しているのや、test/ruby/test_system.rbで > require 'envutil' > しているのがそうです。これらは、テストがある以外のディレクトリから、 > $ ./ruby -Ifoo /src/test/ruby/test_system.rb > などとしても動くように、ということだと思います。 > > 提案) この、$:のトリックなのですが、あちこちのテストに入れていくと、 > 複数テストケースの一括テストで$:がどんどん書き換えられたりして、 > あまり好ましくないと思います。幸い、 > $ ./ruby -Ifoo /src/test/runner.rb /src/test/ruby/test_system.rb > などとすると、lib/test/collector/dir.rbが、$:の面倒をみてくれます。 > ということで、テストを動かす時は上記のようにtest/runner.rbを経由する > ようにして、各個別テストケースファイルからは$:トリックを消して > しまいませんか? $: をいじくっているのは test 以外にも ext/dl/extconf.rb とかもあります し、テスト用に解決するよりももっと一般的に解決したほうがいいんじゃない ですかね。 たぶん、$: じゃなくて読み込み元のソースからの相対パスで require するよ うなものがあればいいのではないかと思いますし。 また、そういうものが欲しいという話自体は何回か出ています。 [ruby-talk:86215] [ruby-talk:65367] [ruby-talk:39840] [ruby-list:32727] [ruby-list:32775] ではそれは Windows 流ということでまつもとさんは否定 的ですけど。 builtin にしておくと install しなくてもそのまま使えるので面倒がないで すが、もしかしたら、次のようなものを添付しておくだけでも面倒はかなり減 るかもしれません。 import.rb: module Kernel module_function # `import' require a library specified by relative pathname. # # Unlike `require', it searches relative location from a file which call # `import'. def import(name) /:\d+\z/ =~ caller[0] require File.expand_path(File.join(File.dirname($`), name)) end end -- [田中 哲][たなか あきら][Tanaka Akira]