Program Tip

Rails 3의 'config.autoload_paths'에 lib를 추가해도 모듈이 자동로드되지 않습니다.

programtip 2020. 10. 23. 08:17
반응형

Rails 3의 'config.autoload_paths'에 lib를 추가해도 모듈이 자동로드되지 않습니다.


사이드 Rails.root/lib폴더에 g.rb라는 파일 이름을 넣습니다 . 파일 내용은 다음과 같습니다.

module Google
end

그런 다음 추가

config.autoload_paths += %W(#{config.root}/lib #{Rails.root}/app/delayed_jobs)

나에게 Rails.root/config/application.rb

그러나에서 Google을 호출하려고 rails console하면 예외가 발생합니다. 내가 실행하는 경우에만 예외가 사라집니다 require 'google'. 왜? 내 파일이 자동으로로드되지 않아야하고 추가 require설명 없이 모듈에 액세스하면 안 됩니까?


흠, 흥미로운 것을 발견했습니다. Rails가 내 클래스를 자동으로로드하려면 클래스 이름이 파일 이름과 폴더 구조를 준수해야합니다. 예를 들어 Google 모듈을 자동으로로드하려면 google.rb/ lib 바로 아래에 배치해야합니다 (/ lib에서 자동로드를 지정하는 경우). 자동로드하려면 Google::Docs내부에 배치 google.rb하거나google/docs.rb


내 모듈을 Heroku에서 실행하는 데 비슷한 문제가 발생했습니다. Stephen C가 언급 한 자동로드 명명 규칙에 추가하여, 모듈 코드는 Heroku의 Rails '프로덕션 환경에서 만든 가정으로 require인해'd ' 여야한다는 것을 발견했습니다 threadsafe( threadsafeproduction.rb구성 파일 에 주석 처리 되었지만 ). 내가 같이 require'호출하기 전에 모듈 파일을 거라고 include모듈에 모든 작업을 시작했다.

require 'mymodule'
include Mymodule

Heroku (프로덕션)에서 모듈을 올바르게로드하는 주제에 대한 이 훌륭한 기사살펴보십시오 .


즉, 자동로드의 포인트이기 때문에의 하지 '필요'모든 앞까지 (시작의 벌금)에. 클래스는 필요 / 참조 될 때로드됩니다. 이렇게하려면 클래스를 찾을 위치를 알 수있는 방법이 필요합니다. 그렇지 않으면 어떤 클래스가 선언되었는지 미리보기 위해 autoload 디렉토리의 모든 파일을로드해야합니다. 트레이드 오프이지만 모든 것을 미리 요구하는 것은 (marbaq이 제안한대로) 자동 로딩이 아닙니다. Ruby에서 제공하는 autoload 명령을 사용할 수 있습니다. 두 개의 인수,로드 할 모듈 (기호화 됨, 예 : Google)을 사용하고 두 번째 인수는 파일 이름입니다. lib가있는 경우 g.rb가됩니다. 로드 경로 ($ :). 자동로드는 Ruby 문서를 참조하세요.


변경 config.autoload_pathsconfig.eager_load_paths

( Rails 문제 # 6850Rails 3.2 콘솔의 lib 디렉토리에서 강제 재로드!를 기반으로 함 )


나는 지금 바로 같은 문제에 직면했고 내 "솔루션"(또는 오히려 해결 방법)은 내 application.rb의 Rails.root / lib에서 필요한 모든 파일을 수동으로 요구하는 것이었다.

require 'lib/message'
require 'lib/store'
require 'lib/vault/vault.rb'
require 'lib/custom_loggers'

module MyApplication
  class Application < Rails::Application

다음 단계는 언급했듯이 모듈 폴더의 파일을 분류하는 것입니다.


최근에이 해결책을 찾았습니다

config / application.rb

module AppName
  class Application < Rails::Application

    # Custom directories with classes and modules you want to be autoloadable.
    config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')]
    config.autoload_paths += Dir[Rails.root.join('app', 'lib', 'extensions')] 

  end
end

첫 번째 구성 호출은 레일이 app / models 디렉토리의 모든 하위 디렉토리를 자동로드하도록 유도하므로 이제 /app/models/sub_directory/model.rb를 자동로드 할 수 있습니다 (대규모 코드 기반으로 앱을 구성하는 데 편리함).

두 번째 구성 호출은 레일이 lib / extensions 디렉토리를 자동로드하도록 유도합니다.

도움이 되었기를 바랍니다

참고 : 이것이 rails 3 특정이라고 생각합니다.

참고 URL : https://stackoverflow.com/questions/4074830/adding-lib-to-config-autoload-paths-in-rails-3-does-not-autoload-my-module

반응형