Rails의 configeager_load는 Rake 작업에 영향을 미치지 않음

3975 단어 RailsRubyraketech

무슨 일이 있었는지


제목과 같이 Railsconfig.eager_load에서 true로 설정하면 Rake 작업에서 eager loading도 유효하지 않습니다.
config/environments/production.rb
config.eager_load = true
연기를 위해 그런 판단을 내리다.
보통 레이크 미션에 모든 반이 필요 없다고 생각하니까 그렇지.
대략적으로 확인된 범위 내에서 적어도 4.0에서 현재의 최신 7.0으로 바뀌었다.앞으로도 이런 행동은 계속될 것이다.
https://github.com/rails/rails/blob/v7.0.2.3/railties/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt#L9-L13

무슨 문제 있어요?


이글 로딩 없으면 뭐가 문제예요?
클래스가 불러온 논리에 의존하면 제대로 실행할 수 없고, 다중 루틴 처리가 있으면 오류가 발생합니다.
# 名前空間下の定数全てを取りたいときとか
Foo.constants

해결하다


조금 늦게 시작해도 그다지 큰 애플리케이션인 eager loading을 사용하는 것이 편리하다.
Rails6.1 이후에는 설정config.rake_eager_load을 통해 해결할 수 있다.
config.rake_eager_load = true
https://github.com/rails/rails/blob/v7.0.2.3/guides/source/configuring.md#configrake_eager_load
이 글을 읽은 현명한 여러분은 반드시 Rails6.1 이하의 화석을 사용하지 않으실 것입니다. 하지만 저는 먼저 Rails6.1 이하의 좋은 방안을 몇 개 쓰겠습니다.
  • Rails6.1 이상으로 업데이트하여 설정config.rake_eager_load
  • 필요한 Rake 작업에서 호출Rails.application.eager_load!
  • 필요한 클래스를 스스로 로드
  • 아래 연결고리를 삽입하여 재현config.rake_eager_loadconfig/application.rb
    # 以下はRails 6.1未満で `rake_eager_load` を疑似的に再現するための実装
    config.rake_eager_load = nil
    rake_tasks do
      if Rails.gem_version >= Gem::Version.new("6.1.0")
        raise "Rails 6.1以降では不要なのでこのコードを削除してください"
      end
      
      config.after_initialize do
        self.eager_load! if self.config.rake_eager_load
      end
    end
    
    필요한 환경에서 효율화
    config/environments/production.rb
    config.rake_eager_load = true
    
  • 총결산


    이번에는 네 가지 방법으로 회피했다.
    Rails 버전을 업데이트하십시오.

    좋은 웹페이지 즐겨찾기