복붙노트

[RUBY-ON-RAILS] 레일 3 루비 - 각 요청에 대해 다시로드 lib 디렉토리

RUBY-ON-RAILS

레일 3 루비 - 각 요청에 대해 다시로드 lib 디렉토리

A는 3 응용 프로그램을 레일 나는 새로운 엔진을 만드는거야. 당신이 추측 수 있듯이,이 엔진은 내 응용 프로그램의 lib 디렉토리에 있습니다.

그러나, 나는 그것을 개발하는 몇 가지 문제가있다. 사실, 나는 내 서버 엔진에서 때마다 나는 변화 무언가를 다시 시작해야합니다.

이를 방지 할 수있는 방법이 있나요?

나는 완전히 LIB 디렉토리 또는 특정 파일 및 각 요청에 대한 자신의 요구 사항을 다시로드 레일을 강제 할 수 있습니까?

당신의 도움을 주셔서 감사합니다 :)

해결법

  1. ==============================

    1.TL; DR

    TL; DR

    가다!

    내가 자세히 설명하겠습니다.

    이 답변이 수락 이유는 각 요청에 lib 디렉토리 폴더를 다시로드에 대한 지원을하지 않기 때문에 나는 모른다. 우선은 레일 2 작동하지만, 문제는 명확하게 레일 3이고 3.0.0의 출시 날짜가 대답의 날짜 이전한다고 생각했다.

    다른 답변은 오버 복잡한 것 또는 실제 솔루션을 제공하지 않습니다.

    나는 그것이 나를 귀찮게 때문에, 일 조금을 조사하기로 결정하고 난 사람들이 이것에 대한 해결 방법을 가지고 있고 그것을 할 때 / lib 디렉토리를 이동 한 후 개발에 응용 프로그램 / 모델 내부에 lib에 파일을 저장하고 관련된 사실을 발견했습니다. 우리는 더 잘 할 수 있습니까?

    내 솔루션은에 대해 테스트한다 :

    당신의 설정 / application.rb에이 넣어 :

    # in config/application.rb
    config.eager_load_paths += ["#{Rails.root}/lib"]
    

    그게 다야! ™

    당신이 예를 들어, 설정 / 환경 / development.rb에 넣어하지 작동하는지 때문에 여기에 넣어해야합니다.

    문을 필요로하기 때문에 반드시 당신의 제거는 모든 당신의 / lib 디렉토리 코드에 대한 문을 필요로 할 것도없는 일이 해결 방법 원인.

    이 코드는 암시 적으로 당신이 (불필요한) 환경 검사를하고 대신에 위의 코드로,이 같은 쓰기 뭔가 결정 그렇다면, 당신의 코드가 필요합니다 :

    # in config/application.rb
    config.eager_load_paths += ["#{Rails.root}/lib"] if Rails.env.development?
    

    이전이 문을 필요에 그들은 여전히이 시나리오에서, 모든에 비 개발 환경이 필요하기 때문에 당신은 조심해야한다.

    그래서 당신은 여전히 ​​당신이 문을 필요에 대한 역 검사를 할 수 있도록, 환경 검사를하기로 결정합니다. 그렇지 않으면 물린거야!

    require "beer_creator" unless Rails.env.development?
    

    당신은 불필요한 무언가에 대한 전체 단락을 작성하는 것도 불필요하다고 생각할 수도 있지만 불필요한 일을하는 것이 필요하다 필요할 때 뭔가에 대해 그 경고 사람들을 생각합니다.

    당신은이 주제에 대한 자세한 내용을 알고이 작은 튜토리얼을 확인하세요.

  2. ==============================

    2.나는 레일 코드를 약간 파고이 함께했다, 그래서 나는 나를 위해 일에 위의를 가져올 수 없습니다 :

    나는 레일 코드를 약간 파고이 함께했다, 그래서 나는 나를 위해 일에 위의를 가져올 수 없습니다 :

    새 파일 : 설정 / 초기화 / reload_lib.rb

    if Rails.env == "development"
      lib_reloader = ActiveSupport::FileUpdateChecker.new(Dir["lib/**/*"]) do
        Rails.application.reload_routes! # or do something better here
      end
    
      # For Rails 5.1+
      ActiveSupport::Reloader.to_prepare do
        lib_reloader.execute_if_updated
      end
    
      # For Rails pre-5.1 
      ActionDispatch::Callbacks.to_prepare do
        lib_reloader.execute_if_updated
      end
    
    end
    

    예, 그것의 역겨운 알고 있지만, 해킹. 거기에 전체 다시로드를 실행할 수있는 더 좋은 방법이 될 수 있지만, 이것은 나를 위해 작동 할 수 있습니다. 내 특정 유스 케이스는 내가 개발에서 근무로 다시로드하는 데 필요한 있도록 랙 응용 프로그램은 레일 경로에 장착했다.

    다음 마지막으로로드 된 이후 / lib 디렉토리 변경 (수정 타임 스탬프)의 모든 파일들이 변경하면 다시로드 트리거 경우 기본적으로 그것이 무엇을하면 검사입니다.

    나는 또한 내 설정 / application.rb이이 말할 수

    config.autoload_paths += %W(#{config.root}/lib)
    config.autoload_paths += Dir["#{config.root}/lib/**/"]
    

    어느 단지 기본적으로 내 LIB 디렉토리에 있는지 확인 모든로드되는합니다.

    Yays!

  3. ==============================

    3.우리는 레일을 이야기하고 있기 때문에 'require_dependency'를 사용하여 lib 디렉토리 / * .rb 파일을 '필요한'에, 가장 쉬운 방법입니다. 그래서 긴 대신의 컨트롤러 / 도우미 / 등 (응용 프로그램에서 .rb 파일 /)를 사용 require_dependency 아무것도 펑키 할 필요없이 작품을 다시로드 필요로한다.

    우리는 레일을 이야기하고 있기 때문에 'require_dependency'를 사용하여 lib 디렉토리 / * .rb 파일을 '필요한'에, 가장 쉬운 방법입니다. 그래서 긴 대신의 컨트롤러 / 도우미 / 등 (응용 프로그램에서 .rb 파일 /)를 사용 require_dependency 아무것도 펑키 할 필요없이 작품을 다시로드 필요로한다.

    내가 그 트랙을 내려 갔다 전에 일을 유일한 해결책은 hemju.com의 일이었다,하지만 난 정말 데브 속도의와 ApplicationController를 해킹하고 싶지 않았다.

  4. ==============================

    4.당신은 추가해야

    당신은 추가해야

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

    설정 / application.rb에서 응용 프로그램 클래스

    https://rails.lighthouseapp.com/projects/8994/tickets/5218-rails-3-rc-does-not-autoload-from-lib

  5. ==============================

    5.레일 3에서, 여기에 자동 리로드 LIB 파일의 비밀 소스입니다. 아래 코드는 예를 들어 비트 과잉, 그러나 그것은 내가 그것을 작동하도록 한 일이다. 당신은 유유 # 고골 락의 메시지를 변경하고이 화면 각 페이지로드에 볼 수 있습니다. 이니셜을 제거하고는 동일하게 유지됩니다.

    레일 3에서, 여기에 자동 리로드 LIB 파일의 비밀 소스입니다. 아래 코드는 예를 들어 비트 과잉, 그러나 그것은 내가 그것을 작동하도록 한 일이다. 당신은 유유 # 고골 락의 메시지를 변경하고이 화면 각 페이지로드에 볼 수 있습니다. 이니셜을 제거하고는 동일하게 유지됩니다.

    /config/initializers/lib_reload.rb (새 파일)

    ActiveSupport::Dependencies.explicitly_unloadable_constants << 'YoYo'
    ActiveSupport::Dependencies.autoload_once_paths.delete(File.expand_path(File.dirname(__FILE__))+'/lib')
    

    /lib/yo_yo.rb

    class YoYo
      def gogo
        "OH HAI THERE"
      end
    end
    

    / 응용 프로그램 / 컨트롤러 / home_controller

    require 'yo_yo'
    class HomeController < ApplicationController
      def index
        @message = YoYo.new.gogo
      end
    end
    
  6. ==============================

    6.여기 내 버전은 레일 / lib에 디렉토리에 다시로드 모든 루비 파일은 해당 파일의 변경 될 때 @ pbhogan의 대답에서 영감이다.

    여기 내 버전은 레일 / lib에 디렉토리에 다시로드 모든 루비 파일은 해당 파일의 변경 될 때 @ pbhogan의 대답에서 영감이다.

    또한 이미 초기화 된 상수에 관한 피하기 메시지에 대한 경고를 침묵.

    레일 3.2.8의로 작동

    if Rails.env.development?
    
      lib_ruby_files = Dir.glob(File.join("lib/**", "*.rb"))
      lib_reloader ||= ActiveSupport::FileUpdateChecker.new(lib_ruby_files) do
        lib_ruby_files.each do |lib_file|
          silence_warnings { require_dependency(lib_file) }
        end
      end
    
      ActionDispatch::Callbacks.to_prepare do
        lib_reloader.execute_if_updated
      end
    
    end
    
  7. ==============================

    7.업데이트 대답

    업데이트 대답

    내 블로그에 내 모든 연구 결과를 정리해 보면, 당신은 더 나은 거기에 보면 :

    올드 대답

    나도 이것에 대한 솔루션을 주위를 둘러 보았다, 그리고 (이 방향으로 점 등으로도 완성도 '술에 대한) 여기 내가 찾은 것입니다.

    Rails3.1로, 엔진이 쉽게 명령을 통해 생성 할 수있는 새로운 my_plugin의 --full 플러그인 레일. 이것은 엔진의 골격을 생성합니다.

    엔진이 될 것 --full 수단은 예를 컨트롤러에 직접 액세스 할 수 있어야합니다 위해 그들이 포함한 응용 프로그램에 정의 된 것처럼 그래서, 오른쪽을 포함하여 응용 프로그램에 "통합". 이것은 예를 들어, 다음을 수행 할 수 있습니다 당신을 포함하여 응용 프로그램의 응용 프로그램 / 헬퍼 / my_helper.rb 도우미로 병합 된 권리가있을 것입니다 my_engine / 응용 프로그램 / 도우미 / my_helper.rb 점에서 도우미 파일이 있습니다.

    엔진에 대한 네임 스페이스를 만드는 또 다른 옵션 --mountable이있다 그래서 자사의 컨트롤러 등 결코에서 충돌을 포함하여 응용 프로그램의 사람과 것이다. 예를 들어, 이러한 결과 에있는 도우미 my_engine / 응용 프로그램 / 도우미 / my_engine / my_helper.rb하는하지 않습니다에서 충돌이있는 도우미 응용 프로그램 / 헬퍼 / my_helper.rb 당신을 포함하여 응용 프로그램입니다.

    이제 더 흥미로운 부분 :

    생성 된 엔진의 테스트 폴더 내에서 완전한 Rails 애플리케이션을 보유하고 더미 폴더에있다! 그것은 무엇을위한인가?

    당신이 엔진을 개발할 때, 그 기능은 자신에 완전하게 작동하기위한 것입니다, 또한 그 자체로 완전하게 테스트해야합니다. 그것은 (엔진에 레일 응용 프로그램의 기존 기능을 추출 할 때이 직관적으로 자주 잘 느낄 것이다하지만) 다른 레일 응용 프로그램 "에서"엔진을 개발하기 위해 "잘못"방법이다, 그래서 이론적으로는 엔진의를 다시로드 필요하지 않습니다 그래서 을 포함하여 응용 프로그램에 대한 모든 요청 코드입니다.

    그것은 전체 레일 더미 응용 프로그램을 사용되는 앱 것처럼, 개발 및 엔진을 테스트 : "오른쪽"방법이 될 것 같습니다! 거기에 당신은 당신이 어떤 "정상"레일 응용 프로그램에서 할 수있는 모든 것을, 예를 들어, 작업을 수행 할 수 있습니다 엔진이 제공해야하는 기능을 사용하는 등 컨트롤러, 모델, 뷰를 만들 수 있습니다. 또한 일반적으로 테스트 / 더미 디렉토리 및 액세스 로컬 호스트에 더미 응용 프로그램에서 레일의를 사용하여 서버를 시작할 수 있습니다 : 3000, 및 테스트를 실행할 때, 더미 응용 프로그램은 자동으로 통합 테스트에 사용됩니다. 아주 좋은! :-)

    당신은 당신의 물건을 넣을 위치를 조심해야합니다 :

    경로 => '경로 /로 / my_engine'또는 보석으로 GitHub의에 게시 : 보석 'my_engine을'그럼 나중에 당신은 쉽게 다음과 같은 주요 응용 프로그램의 Gemfile에 엔진을로드 할 수 있습니다.

    (한 가지 흥미로운 점은 (그리고) 다시이 주제의 주제에 온 것은 내가 더미의 서버를 시작할 때, 다음 엔진의 모든 변화는 그래서 어떻게 든 레일 내에서 엔진을 포함 할 수있을 것 같다! 그 안에 반영 될 것이다 를 캐시하지 않고 응용 프로그램은 ...? 나는 이런 방법을 모르겠어요.)

    엔진 자체에 완전히 설 수있는 기능을 제공합니다, 그래서도 개발하고 자체 테스트해야합니다 : 그래서 요약합니다. 안정된 상태에 도달했을 때 그런 다음, 그것은 그 기능을 필요로 다른 응용 프로그램으로 포함 할 수있다.

    여기에 유용한 몇 가지 자료입니다 :

    나는이 답변이 도움이되기를 바랍니다. 그래서 어떤 잘못된 정보가 있다면, 말해, 나는 그것을 수정하겠습니다, 아직 일반적으로 엔진에 아주 새로운 해요.

  8. ==============================

    8.application_controller.rb 또는 기본 컨트롤러에 추가

    application_controller.rb 또는 기본 컨트롤러에 추가

      before_filter :dev_reload if Rails.env.eql? 'development'
    
      def dev_reload
        # add lib files here
        ["rest_client.rb"].each do |lib_file|
          ActiveSupport::Dependencies.load_file lib_file
        end
      end
    

    나를 위해 일했다.

  9. ==============================

    9.노트에 레일 3 "load_once_paths"는 "autoload_once_paths을."가 있음

    노트에 레일 3 "load_once_paths"는 "autoload_once_paths을."가 있음

    또한, 명시 적으로 뭔가를 넣어하지 않는 한이 비어 있어야 것으로 보인다.

  10. ==============================

    10.또한, 당신은 (@ dishod의 솔루션에 추가) application.rb에 다음 줄을 주석 있는지 확인하고 확인 모듈 이름은 파일 이름과 동일 있는지 확인 (그렇지 않으면 레일을 찾을 수 없습니다 )

    또한, 당신은 (@ dishod의 솔루션에 추가) application.rb에 다음 줄을 주석 있는지 확인하고 확인 모듈 이름은 파일 이름과 동일 있는지 확인 (그렇지 않으면 레일을 찾을 수 없습니다 )

    #Dir.glob("./lib/*.{rb}").each { |file| require file } # require each file from lib directory
    
  11. ==============================

    11.응용 프로그램의 보석의 내부에 lib 디렉토리를 다시로드 레일 3.2.13 근무 :

    응용 프로그램의 보석의 내부에 lib 디렉토리를 다시로드 레일 3.2.13 근무 :

    require_dependency 'the_class'

    config.autoload_paths + = %의 W (#} {config.root /../ 환상 / LIB)

  12. from https://stackoverflow.com/questions/3282655/ruby-on-rails-3-reload-lib-directory-for-each-request by cc-by-sa and MIT license