首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Zeitwerk在Rails 6.1.6中不需要适当的lib类

Zeitwerk在Rails 6.1.6中不需要适当的lib类
EN

Stack Overflow用户
提问于 2022-05-16 23:24:10
回答 1查看 434关注 0票数 0

我正在尝试将我的应用程序从Rails 5.2升级到6.1,并使用Zeitwerk autoload,而且我在自动加载/lib类时遇到了一些问题。

我把这个包括在config/application.rb

代码语言:javascript
复制
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时,它会提醒我:

代码语言:javascript
复制
Hold on, I am eager loading the application.
expected file lib/facades/coconut/v2/foo.rb to define constant Foo

声明如下:

代码语言:javascript
复制
# /lib/facades/coconut/v2/foo.rb

module Coconut
  module V2
    class Foo
      # ...
    end
  end
end

当我尝试调试它(将一个binding.pry放在某个测试文件中)时,Zeitwerk说它没有定义,直到我调用它时没有模块(名称空间):

代码语言:javascript
复制
[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中有另一个类遵循相同的结构,但是它运行得很好,例如

代码语言:javascript
复制
# /lib/api/services/youtube/client.rb

module Services
  module Youtube
    class Client
      # ...
    end
  end
end

在一些测试中使用binding.pry检查它:

代码语言:javascript
复制
pry(#<#filename>)> Services::Youtube::Client
=> Services::Youtube::Client

有没有人有这个问题或者知道会发生什么?

系统:

  • ruby 2.7.6p219
  • Rails 6.1.6
  • Zeitwerk (2.5.4)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-16 23:54:09

自动路径是根目录,而不是其内容。

您需要将通配符作为文档化的这里删除。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72266610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档