[Rake-devel] Fwd: [test-unit-users-en:00074] Re: Having problems with startup when combined with Rake

Daniel Berger djberg96 at gmail.com
Fri May 11 16:34:39 UTC 2012


Forwarding a message from Kouhei Sutou regarding an issue we found in
the Rake that ships with Ruby by default.

The issue stems around his test-unit2 library, where it's loading the
wrong test/unit because of $LOAD_PATH handling when it uses the
default Rake. He provides an explanation for the problem and has
provided a diff near the bottom. There's a workaround, too.

I wasn't sure who should get this, so I sent it to both lists hoping
someone could chime in.

While I think this is a minor issue now, it could be a larger issue
down the road if/when more of the stdlib is turned into gems with the
same name.



---------- Forwarded message ----------
From: Kouhei Sutou <kou at cozmixng.org>
Date: Fri, May 11, 2012 at 7:19 AM
Subject: [test-unit-users-en:00074] Re: Having problems with startup
when combined with Rake
To: test-unit-users-en at rubyforge.org


In <CAGSpibmdyopjdfGRsmDOPRck5L76L82RMMjZC9K0+e2cmjH-jA at mail.gmail.com>
 "[test-unit-users-en:00073] Re: Having problems with startup when
combined with Rake" on Thu, 10 May 2012 09:16:09 -0600,
 Daniel Berger <djberg96 at gmail.com> wrote:

> I think I figured it out. Somehow it was picking up the old test-unit
> library. Once I renamed that old test-unit directory, everything
> worked. I'm not sure why it was happening though, since I was
> requiring 'test-unit', not 'test/unit'.
> I did not have my RUBYOPT environment variable set, but I didn't think
> it was necessary.
> I'm not sure why it would work with 1.8.7 and not 1.9.3, though.

I found the problem. :-)

First, here are workarounds:

 1. Use :diret loader:

    Rake::TestTask.new('test_foo') do |t|
      t.loader = :direct

 2. Use Rake installed by gem:

    % gem install rake

The cause of the problem is rake/testtask.rb prepends the
directory where rake.rb is to $LOAD_PATH. The directory is
Ruby's default library diretory when you are using bundled

> c:\Users\djberge\Repositories\foo>rake test_foo
> c:/usr/bin/ruby.exe -w -I"lib" -I"c:/usr/lib/ruby/1.9.1" "c:/usr/lib/ruby/1.9.1/rake/rake_test_loader.rb" "test/test_foo.rb"

In your case, "c:/usr/lib/ruby/1.9.1" is the direcotry.

The directory should not be prepended because RubyGems
inserts test-unit's library directory after load paths added
by -I.

In your case:

 p $LOAD_PATH ->
   ["lib", "c:/usr/lib/ruby/1.9.1", "#{Gem.path}/gems/test-unit-2.4.9/lib", ...]

test/unit (that is a minitest wrapper not test-unit gem!) is
in "c:/usr/lib/ruby/1.9.1". So 'require "test/unit"'
requires minitest wrapper instead of test-unit gem. This is
the reason for the problem.

The solution of this problem is rake/testtask.rb doesn't add
-I"c:/usr/lib/ruby/1.9.1" if it's not
needed. "c:/usr/lib/ruby/1.9.1" is n't needed because the
path is in $LOAD_PATH in default. The directory is
"#{Gem.path}/gems/rake-X.Y.Z/lib" if you are using Rake
installed by gem. In the case, the -I"..." is needed.

OK. Here is a patch against the master of Rake:

diff --git a/lib/rake/testtask.rb b/lib/rake/testtask.rb
index 04d3ae4..98b8c61 100644
--- a/lib/rake/testtask.rb
+++ b/lib/rake/testtask.rb
@@ -157,7 +157,12 @@ module Rake
      when :testrb
        "-S testrb #{fix}"
      when :rake
-        "-I\"#{rake_lib_dir}\" \"#{rake_loader}\""
+        loarder_code = "\"#{rake_loader}\""
+        lib_dir_for_loader = rake_lib_dir
+        if RbConfig::CONFIG["rubylibdir"] != lib_dir_for_loader
+          loader_code = "-I\"#{lib_dir_for_loader}\" #{loader_code}"
+        end
+        loader_code

Could you send the patch to Rake(*)? I don't have time to
send it and discuss about the problem... :<

(*) https://github.com/jimweirich/rake

test-unit-users-en mailing list
test-unit-users-en at rubyforge.org

More information about the Rake-devel mailing list