Zeitwerk 在 Rails 6.1.6 中不需要 lib 类
Zeitwerk doesn't requires lib classes properly in Rails 6.1.6
我正在尝试将我的应用程序从 Rails 5.2 更新到 6.1,并使用 Zeitwerk 自动加载,但我在自动加载 /lib
类.
我在 config/application.rb
中包含了这个:
config.load_defaults 5.2
config.autoloader = :zeitwerk
config.enable_dependency_loading = true
config.autoload_paths += Dir[Rails.root.join('lib/**/*')]
config.eager_load_paths += Dir[Rails.root.join('lib/**/*')]
而且,当我 运行 zeitwerk:check
时,它提醒我:
Hold on, I am eager loading the application.
expected file lib/facades/coconut/v2/foo.rb to define constant Foo
声明为:
# /lib/facades/coconut/v2/foo.rb
module Coconut
module V2
class Foo
# ...
end
end
end
当我尝试调试它时(在一些测试文件中放置 binding.pry
),Zeitwerk 说它没有定义,直到我在没有模块(命名空间)的情况下调用它:
[1] pry(#<#filename>)> Coconut::V2::Foo
NameError: uninitialized constant Coconut::V2::Foo
from (pry):1:in `setup`
[2] pry(#<#filename>)> Foo
Zeitwerk::NameError: expected file /my-app/lib/api/coconut/v2/foo.rb to define constant Foo, but didn't
from /usr/local/bundle/gems/zeitwerk-2.5.4/lib/zeitwerk/loader/callbacks.rb:25:in `on_file_autoloaded'
[3] pry(#<#filename>)> Coconut::V2::Foo
=> Coconut::V2::Foo
听起来很奇怪,因为在/lib
中还有另一个类遵循相同的结构,但效果很好,例如
# /lib/api/services/youtube/client.rb
module Services
module Youtube
class Client
# ...
end
end
end
在一些测试中用 binding.pry
检查它:
pry(#<#filename>)> Services::Youtube::Client
=> Services::Youtube::Client
有没有人遇到过这个问题或知道会发生什么?
系统:
- ruby 2.7.6p219
- Rails6.1.6
- 时代周刊 (2.5.4)
自动加载路径是根目录,而不是其内容。
您需要按照记录删除通配符 here。
我正在尝试将我的应用程序从 Rails 5.2 更新到 6.1,并使用 Zeitwerk 自动加载,但我在自动加载 /lib
类.
我在 config/application.rb
中包含了这个:
config.load_defaults 5.2
config.autoloader = :zeitwerk
config.enable_dependency_loading = true
config.autoload_paths += Dir[Rails.root.join('lib/**/*')]
config.eager_load_paths += Dir[Rails.root.join('lib/**/*')]
而且,当我 运行 zeitwerk:check
时,它提醒我:
Hold on, I am eager loading the application.
expected file lib/facades/coconut/v2/foo.rb to define constant Foo
声明为:
# /lib/facades/coconut/v2/foo.rb
module Coconut
module V2
class Foo
# ...
end
end
end
当我尝试调试它时(在一些测试文件中放置 binding.pry
),Zeitwerk 说它没有定义,直到我在没有模块(命名空间)的情况下调用它:
[1] pry(#<#filename>)> Coconut::V2::Foo
NameError: uninitialized constant Coconut::V2::Foo
from (pry):1:in `setup`
[2] pry(#<#filename>)> Foo
Zeitwerk::NameError: expected file /my-app/lib/api/coconut/v2/foo.rb to define constant Foo, but didn't
from /usr/local/bundle/gems/zeitwerk-2.5.4/lib/zeitwerk/loader/callbacks.rb:25:in `on_file_autoloaded'
[3] pry(#<#filename>)> Coconut::V2::Foo
=> Coconut::V2::Foo
听起来很奇怪,因为在/lib
中还有另一个类遵循相同的结构,但效果很好,例如
# /lib/api/services/youtube/client.rb
module Services
module Youtube
class Client
# ...
end
end
end
在一些测试中用 binding.pry
检查它:
pry(#<#filename>)> Services::Youtube::Client
=> Services::Youtube::Client
有没有人遇到过这个问题或知道会发生什么?
系统:
- ruby 2.7.6p219
- Rails6.1.6
- 时代周刊 (2.5.4)
自动加载路径是根目录,而不是其内容。
您需要按照记录删除通配符 here。