Abbiamo appena creato un nuovo file in "lib" che ha generato una serie di mal di testa che comportano errori di caricamento.Comportamento "LoadError" incoerente con namespacing/libagamento "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
L'esecuzione di questo spec in Rspec ci dà il seguente errore quando si arriva al primo ' descrizione:
/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'
TUTTAVIA! Abbiamo utilizzato molti altri file per molto tempo che hanno una struttura identica. Ad esempio, ecco un altro che sta funzionando benissimo da quando è stato creato:
/lib/smart_set.rb
module MyCompany
class SmartSet < Array
...
end
end
E /spec/lib/smart_set_spec.rb
require 'spec_helper'
describe MyCompany::SmartSet do
describe "..." do
...
end
end
Questo il file ha la stessa struttura ma non causa alcun problema.
ResponseSet (la classe problema) ha apparentemente problemi di caricamento per nessun motivo visibile. Nella console rotaie, la prima volta che tenta di creare una, ottengo un errore, ma poi mi può creare un seguito:
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
=> []
Inoltre, l'aggiunta di
require 'response_set'
in cima response_set_spec. rb consente a quei test di funzionare. Ma nessuna cosa è necessaria per smart_set_spec.rb.
Il seguente è messo in pratica application.rb:
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]
config.autoload_paths += Dir["#{config.root}/app/models/**/"]
Ora, capisco che Rails ha una sorta di parere su come la struttura dei file deve corrispondere la struttura dello spazio dei nomi per questi tipi di cose, e abbiamo ristrutturato i nostri moduli e file verso questa fine. SEMBRA aver risolto il problema (anche se stavamo vedendo alcuni altri strani errori di caricamento per un po 'quando abbiamo eseguito l'intera suite di test - questi sono andati misteriosamente via). Ciò nonostante, tutti qui sono sconcertati e non un po 'infastiditi dal fatto che Rails sia così incoerente e vorremmo sapere perché. Come puoi vedere ci sono due file identici per quanto riguarda il namespacing e la struttura dei file, trattati in modo completamente diverso. In effetti abbiamo una dozzina di altri file nel livello più alto di "lib" con namespaces simile che non ha mai causato problemi. Qualcuno può spiegare cosa diavolo sta succedendo qui?
Grazie Alexey. Sembra sospettoso. Mi sembra che l'aumento dell'eccezione debba dipendere dal fatto che il "require_or_load" del clima ha avuto successo. Ma poi di nuovo non ho molta familiarità con il labirinto che è il coraggio di Rails. –
@Nick, apparentemente l'eccezione viene sollevata quando, dopo aver caricato il file, la costante non è ancora definita. Nel tuo caso, sembra che il file definisca 'ResponseSet' mentre definisce' MyCompany :: ResponseSet' (questo è come mi sembra, ma non sono uno specialista). L'incoerenza è la cosa più strana. Sei sicuro di non aver semplificato il problema originale? Forse 'MyCompany :: SmartSet' è in'/lib/my_company/smart_set.rb' e non solo '/ lib/smart_set.rb'? Ho presentato una [segnalazione di bug a GitHub] (https://github.com/rails/rails/issues/2572) su un problema simile. – Alexey
No. Le strutture dei file erano identiche. Passammo un paio d'ore a controllare ogni possibile differenza che potessimo pensare. Le uniche differenze sono con l'effettiva implementazione di ogni classe (cioè attributi e metodi) ma nessuna di queste dovrebbe influire sul modo in cui i file vengono caricati! –