Właśnie utworzyliśmy nowy plik w bibliotece 'lib', który spowodował szereg problemów związanych z błędami ładowania.Niespójne zachowanie "LoadError" z zachowaniem nazw/ładowaniem "lib"
/lib/response_set.rb:
module MyCompany
class ResponseSet < Array
...
end
end
/spec/lib/response_set_spec.rb
require 'spec_helper'
describe MyCompany::ResponseSet do
describe "..." do
...
end
end
Uruchomienie tego specyfikację w rspec daje nam następujący komunikat o błędzie, gdy dostaje się do pierwszej " opis ":
/Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:492:in `load_missing_constant': Expected /Users/my_stuff/projects/my_project/lib/response_set.rb to define ResponseSet (LoadError)
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:183:in `block in const_missing'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:181:in `each'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:181:in `const_missing'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/backward_compatibility.rb:20:in `const_missing'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-expectations-2.5.0/lib/rspec/expectations/backward_compatibility.rb:6:in `const_missing'
from /Users/my_stuff/projects/my_project/spec/lib/response_set_spec.rb:4:in `<top (required)>'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/configuration.rb:386:in `load'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/configuration.rb:386:in `block in load_spec_files'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/configuration.rb:386:in `map'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/configuration.rb:386:in `load_spec_files'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/command_line.rb:18:in `run'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/runner.rb:55:in `run_in_process'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/runner.rb:46:in `run'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/runner.rb:10:in `block in autorun'
JEDNAKŻE! Od dłuższego czasu używamy wielu innych plików o identycznej strukturze. Na przykład, oto jeszcze jeden, który pracuje w porządku, ponieważ został stworzony:
/lib/smart_set.rb
module MyCompany
class SmartSet < Array
...
end
end
I /spec/lib/smart_set_spec.rb
require 'spec_helper'
describe MyCompany::SmartSet do
describe "..." do
...
end
end
ten plik ma identyczną strukturę, ale nie powoduje żadnych problemów.
ResponseSet (klasa problemu) najwyraźniej ma problemy z ładowaniem bez widocznego powodu. W konsoli szyn, po raz pierwszy staram się stworzyć jeden, pojawia się błąd, ale potem można utworzyć później:
Loading development environment (Rails 3.0.4)
ruby-1.9.2-p136 :001 > rs = MyCompany::ResponseSet.new
LoadError: Expected /Users/my_stuff/projects/my_project/lib/response_set.rb to define ResponseSet
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:492:in `load_missing_constant'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:183:in `block in const_missing'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:181:in `each'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:181:in `const_missing'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:503:in `load_missing_constant'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:183:in `block in const_missing'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:181:in `each'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:181:in `const_missing'
from (irb):1
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/railties-3.0.4/lib/rails/commands/console.rb:44:in `start'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/railties-3.0.4/lib/rails/commands/console.rb:8:in `start'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/railties-3.0.4/lib/rails/commands.rb:23:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
ruby-1.9.2-p136 :002 > rs = MyCompany::ResponseSet.new
=> []
również dodanie
require 'response_set'
na szczycie response_set_spec. rb pozwala na uruchomienie tych testów. Ale nie ma czegoś takiego dla smart_set_spec.rb.
Poniżej znajduje się na miejscu w environment.rb:
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]
config.autoload_paths += Dir["#{config.root}/app/models/**/"]
Teraz rozumiem, że Rails ma jakąś opinię na temat struktury pliku należy dopasować strukturę nazw dla tego typu rzeczy, a my zrestrukturyzowane nasze moduły i pliki w tym celu. SEEMS naprawił problem (chociaż przez jakiś czas widzieliśmy inne dziwne błędy ładowania, gdy uruchomiliśmy pełny zestaw testów - te w tajemniczy sposób zniknęły). Mimo to wszyscy tutaj są zdumieni i nie denerwują się, że Rails jest tak niekonsekwentny i chcielibyśmy wiedzieć dlaczego. Jak widać, istnieją dwa pliki, które są identyczne pod względem przestrzeni nazw i struktury plików, traktowane są zupełnie inaczej. W rzeczywistości mamy około tuzina innych plików na najwyższym poziomie "lib" o podobnym ustawieniu przestrzeni nazw, które nigdy nie powodowały żadnych problemów. Czy ktoś może wyjaśnić, co tu się dzieje?
Dziękuję Alexey. To wygląda podejrzanie. Wydaje mi się, że podniesienie wyjątku powinno zależeć od pogody "require_or_load". Ale znowu nie jestem zaznajomiony z labiryntem, którym są Railsowe jelita. –
@Nick, najwyraźniej wyjątek jest wywoływany, gdy po załadowaniu pliku stała nadal nie jest zdefiniowana. W twoim przypadku wygląda na to, że plik ma zdefiniować 'ResponseSet' podczas definiowania' MyCompany :: ResponseSet' (tak to wygląda, ale nie jestem specjalistą). Ta niespójność jest najdziwniejsza. Czy jesteś pewien, że nie upraszczałeś oryginalnego problemu? Może 'MyCompany :: SmartSet' znajduje się w'/lib/my_company/smart_set.rb', a nie tylko '/ lib/smart_set.rb'? Przesłałem [zgłoszenie błędu na GitHub] (https://github.com/rails/rails/issues/2572) o podobnym problemie. – Alexey
Nie. Struktury plików były identyczne. Spędziliśmy kilka godzin sprawdzając każdą możliwą różnicę, jaką mogliśmy wymyślić. Jedyne różnice dotyczą rzeczywistej implementacji każdej klasy (tj. Atrybutów i metod), ale żaden z nich nie powinien wpływać na sposób wczytywania plików! –