Zeitwerk не требует должных классов lib в 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

Кто-нибудь имел эту проблему или знает, что может произойти?

Система:

  • рубин 2.7.6p219
  • Рельсы 6.1.6
  • Цайтверк (2.5.4)
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Путь автозагрузки — это корневой каталог, а не его содержимое.

Вам нужно удалить подстановочные знаки, как задокументировано здесь.

Другие вопросы по теме