Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Autoloads not set when new namespaces are loaded #15

Closed
jairovm opened this issue Mar 5, 2019 · 1 comment
Closed

Autoloads not set when new namespaces are loaded #15

jairovm opened this issue Mar 5, 2019 · 1 comment

Comments

@jairovm
Copy link

jairovm commented Mar 5, 2019

Hi @fxn !

I'm playing around with Rails 6.0.0.beta2 and came across this error where
constants inside of a ruby namespace are not being loaded by zeitwerk.

I spent some time debugging this error and it seems like bootsnap is preventing
TracePoint.new(:class) calls from being triggered so zeitwerk doesn't not
set autoloads for constants under that namespace.

Here are some simple steps to reproduce that error and how I was able to make it
run by not requiring bootsnap/setup.

Thank for your amazing work on this project.

Create a brand new rails app*

rails new zeitwerk
cd zeitwerk

Create Admin::Test class*

mkdir app/models/admin
echo 'class Admin; end' > app/models/admin.rb
echo 'class Admin::Test; end' > app/models/admin/test.rb

Enable zeitwerk logger*

echo 'Rails.autoloaders.logger = method(:puts)' >> config/application.rb

Try to print Admin::Test class name

DISABLE_SPRING=true rails runner 'puts Admin::Test.name'
Zeitwerk@rails.main: autoload set for ApplicationCable, to be autovivified from /Users/jairovm/Sites/ruby/rails/tmp/zeitwerk/app/channels/application_cable
Zeitwerk@rails.main: autoload set for ApplicationController, to be loaded from /Users/jairovm/Sites/ruby/rails/tmp/zeitwerk/app/controllers/application_controller.rb
Zeitwerk@rails.main: autoload set for ApplicationHelper, to be loaded from /Users/jairovm/Sites/ruby/rails/tmp/zeitwerk/app/helpers/application_helper.rb
Zeitwerk@rails.main: autoload set for ApplicationJob, to be loaded from /Users/jairovm/Sites/ruby/rails/tmp/zeitwerk/app/jobs/application_job.rb
Zeitwerk@rails.main: autoload set for ApplicationMailer, to be loaded from /Users/jairovm/Sites/ruby/rails/tmp/zeitwerk/app/mailers/application_mailer.rb
Zeitwerk@rails.main: autoload set for Admin, to be autovivified from /Users/jairovm/Sites/ruby/rails/tmp/zeitwerk/app/models/admin
Zeitwerk@rails.main: autoload set for Admin, to be loaded from /Users/jairovm/Sites/ruby/rails/tmp/zeitwerk/app/models/admin.rb
Zeitwerk@rails.main: autoload set for ApplicationRecord, to be loaded from /Users/jairovm/Sites/ruby/rails/tmp/zeitwerk/app/models/application_record.rb
Zeitwerk@rails.once: autoload set for ActionText::TagHelper, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/actiontext-6.0.0.beta2/app/helpers/action_text/tag_helper.rb
Zeitwerk@rails.once: autoload set for ActionText::ContentHelper, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/actiontext-6.0.0.beta2/app/helpers/action_text/content_helper.rb
Zeitwerk@rails.once: autoload set for ActionText::RichText, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/actiontext-6.0.0.beta2/app/models/action_text/rich_text.rb
Zeitwerk@rails.once: autoload set for ActionMailbox::BaseController, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/actionmailbox-6.0.0.beta2/app/controllers/action_mailbox/base_controller.rb
Zeitwerk@rails.once: autoload set for ActionMailbox::Ingresses, to be autovivified from /usr/local/lib/ruby/gems/2.5.0/gems/actionmailbox-6.0.0.beta2/app/controllers/action_mailbox/ingresses
Zeitwerk@rails.once: autoload set for Rails::Conductor, to be autovivified from /usr/local/lib/ruby/gems/2.5.0/gems/actionmailbox-6.0.0.beta2/app/controllers/rails/conductor
Zeitwerk@rails.once: autoload set for ActionMailbox::IncinerationJob, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/actionmailbox-6.0.0.beta2/app/jobs/action_mailbox/incineration_job.rb
Zeitwerk@rails.once: autoload set for ActionMailbox::RoutingJob, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/actionmailbox-6.0.0.beta2/app/jobs/action_mailbox/routing_job.rb
Zeitwerk@rails.once: autoload set for ActionMailbox::InboundEmail, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/actionmailbox-6.0.0.beta2/app/models/action_mailbox/inbound_email.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::DirectUploadsController, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/controllers/active_storage/direct_uploads_controller.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::BaseController, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/controllers/active_storage/base_controller.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::BlobsController, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/controllers/active_storage/blobs_controller.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::RepresentationsController, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/controllers/active_storage/representations_controller.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::DiskController, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/controllers/active_storage/disk_controller.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::SetCurrent, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/controllers/concerns/active_storage/set_current.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::SetBlob, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/controllers/concerns/active_storage/set_blob.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::BaseJob, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/jobs/active_storage/base_job.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::AnalyzeJob, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/jobs/active_storage/analyze_job.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::PurgeJob, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/jobs/active_storage/purge_job.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::Variant, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/models/active_storage/variant.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::Blob, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/models/active_storage/blob.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::Filename, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/models/active_storage/filename.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::Variation, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/models/active_storage/variation.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::Attachment, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/models/active_storage/attachment.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::Current, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/models/active_storage/current.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::Preview, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/models/active_storage/preview.rb
Zeitwerk@rails.main: constant Admin loaded from file /Users/jairovm/Sites/ruby/rails/tmp/zeitwerk/app/models/admin.rb
Please specify a valid ruby command or the path of a script to run.
Run 'rails runner -h' for help.

uninitialized constant Admin::Test

Disable bootsnap

sed -i '' "s/require 'bootsnap\/setup'/#require 'bootsnap\/setup'/g" config/boot.rb

Try again ( it worked this time )

DISABLE_SPRING=true rails runner 'puts Admin::Test.name'
Zeitwerk@rails.main: autoload set for ApplicationCable, to be autovivified from /Users/jairovm/Sites/ruby/rails/tmp/zeitwerk/app/channels/application_cable
Zeitwerk@rails.main: autoload set for ApplicationController, to be loaded from /Users/jairovm/Sites/ruby/rails/tmp/zeitwerk/app/controllers/application_controller.rb
Zeitwerk@rails.main: autoload set for ApplicationHelper, to be loaded from /Users/jairovm/Sites/ruby/rails/tmp/zeitwerk/app/helpers/application_helper.rb
Zeitwerk@rails.main: autoload set for ApplicationJob, to be loaded from /Users/jairovm/Sites/ruby/rails/tmp/zeitwerk/app/jobs/application_job.rb
Zeitwerk@rails.main: autoload set for ApplicationMailer, to be loaded from /Users/jairovm/Sites/ruby/rails/tmp/zeitwerk/app/mailers/application_mailer.rb
Zeitwerk@rails.main: autoload set for Admin, to be autovivified from /Users/jairovm/Sites/ruby/rails/tmp/zeitwerk/app/models/admin
Zeitwerk@rails.main: autoload set for Admin, to be loaded from /Users/jairovm/Sites/ruby/rails/tmp/zeitwerk/app/models/admin.rb
Zeitwerk@rails.main: autoload set for ApplicationRecord, to be loaded from /Users/jairovm/Sites/ruby/rails/tmp/zeitwerk/app/models/application_record.rb
Zeitwerk@rails.once: autoload set for ActionText::TagHelper, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/actiontext-6.0.0.beta2/app/helpers/action_text/tag_helper.rb
Zeitwerk@rails.once: autoload set for ActionText::ContentHelper, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/actiontext-6.0.0.beta2/app/helpers/action_text/content_helper.rb
Zeitwerk@rails.once: autoload set for ActionText::RichText, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/actiontext-6.0.0.beta2/app/models/action_text/rich_text.rb
Zeitwerk@rails.once: autoload set for ActionMailbox::BaseController, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/actionmailbox-6.0.0.beta2/app/controllers/action_mailbox/base_controller.rb
Zeitwerk@rails.once: autoload set for ActionMailbox::Ingresses, to be autovivified from /usr/local/lib/ruby/gems/2.5.0/gems/actionmailbox-6.0.0.beta2/app/controllers/action_mailbox/ingresses
Zeitwerk@rails.once: autoload set for Rails::Conductor, to be autovivified from /usr/local/lib/ruby/gems/2.5.0/gems/actionmailbox-6.0.0.beta2/app/controllers/rails/conductor
Zeitwerk@rails.once: autoload set for ActionMailbox::IncinerationJob, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/actionmailbox-6.0.0.beta2/app/jobs/action_mailbox/incineration_job.rb
Zeitwerk@rails.once: autoload set for ActionMailbox::RoutingJob, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/actionmailbox-6.0.0.beta2/app/jobs/action_mailbox/routing_job.rb
Zeitwerk@rails.once: autoload set for ActionMailbox::InboundEmail, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/actionmailbox-6.0.0.beta2/app/models/action_mailbox/inbound_email.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::DirectUploadsController, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/controllers/active_storage/direct_uploads_controller.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::BaseController, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/controllers/active_storage/base_controller.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::BlobsController, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/controllers/active_storage/blobs_controller.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::RepresentationsController, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/controllers/active_storage/representations_controller.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::DiskController, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/controllers/active_storage/disk_controller.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::SetCurrent, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/controllers/concerns/active_storage/set_current.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::SetBlob, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/controllers/concerns/active_storage/set_blob.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::BaseJob, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/jobs/active_storage/base_job.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::AnalyzeJob, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/jobs/active_storage/analyze_job.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::PurgeJob, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/jobs/active_storage/purge_job.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::Variant, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/models/active_storage/variant.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::Blob, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/models/active_storage/blob.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::Filename, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/models/active_storage/filename.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::Variation, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/models/active_storage/variation.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::Attachment, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/models/active_storage/attachment.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::Current, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/models/active_storage/current.rb
Zeitwerk@rails.once: autoload set for ActiveStorage::Preview, to be loaded from /usr/local/lib/ruby/gems/2.5.0/gems/activestorage-6.0.0.beta2/app/models/active_storage/preview.rb
Zeitwerk@rails.main: autoload set for Admin::Test, to be loaded from /Users/jairovm/Sites/ruby/rails/tmp/zeitwerk/app/models/admin/test.rb
Zeitwerk@rails.main: constant Admin loaded from file /Users/jairovm/Sites/ruby/rails/tmp/zeitwerk/app/models/admin.rb
Zeitwerk@rails.main: constant Admin::Test loaded from file /Users/jairovm/Sites/ruby/rails/tmp/zeitwerk/app/models/admin/test.rb
Admin::Test

VERSIONS

bundle show rails                                                                                                                                                                             [18:14:54]
/usr/local/lib/ruby/gems/2.5.0/gems/rails-6.0.0.beta2

bundle show bootsnap                                                                                                                                                                          [18:14:15]
/usr/local/lib/ruby/gems/2.5.0/gems/bootsnap-1.4.1

bundle show zeitwerk                                                                                                                                                                          [18:15:11]
/usr/local/lib/ruby/gems/2.5.0/gems/zeitwerk-1.3.1
@fxn
Copy link
Owner

fxn commented Mar 5, 2019

That was an awesome issue report! 👏

You are right, the root problem lives in Ruby 2.5, and manisfests itself via the bootsnap bytecode cache.

I have documented it in rails/rails#35475 (this morning, didn't exist when you opened this ticket), and there are some workarounds explained there.

Thanks so much for the detailed analysis.

Let me close here, since Zeitwerk itself is good.

@fxn fxn closed this as completed Mar 5, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants