[RUBY-ON-RAILS] 레일 3 루비 - 각 요청에 대해 다시로드 lib 디렉토리
RUBY-ON-RAILS레일 3 루비 - 각 요청에 대해 다시로드 lib 디렉토리
A는 3 응용 프로그램을 레일 나는 새로운 엔진을 만드는거야. 당신이 추측 수 있듯이,이 엔진은 내 응용 프로그램의 lib 디렉토리에 있습니다.
그러나, 나는 그것을 개발하는 몇 가지 문제가있다. 사실, 나는 내 서버 엔진에서 때마다 나는 변화 무언가를 다시 시작해야합니다.
이를 방지 할 수있는 방법이 있나요?
나는 완전히 LIB 디렉토리 또는 특정 파일 및 각 요청에 대한 자신의 요구 사항을 다시로드 레일을 강제 할 수 있습니까?
당신의 도움을 주셔서 감사합니다 :)
해결법
-
==============================
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.나는 레일 코드를 약간 파고이 함께했다, 그래서 나는 나를 위해 일에 위의를 가져올 수 없습니다 :
나는 레일 코드를 약간 파고이 함께했다, 그래서 나는 나를 위해 일에 위의를 가져올 수 없습니다 :
새 파일 : 설정 / 초기화 / 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.우리는 레일을 이야기하고 있기 때문에 'require_dependency'를 사용하여 lib 디렉토리 / * .rb 파일을 '필요한'에, 가장 쉬운 방법입니다. 그래서 긴 대신의 컨트롤러 / 도우미 / 등 (응용 프로그램에서 .rb 파일 /)를 사용 require_dependency 아무것도 펑키 할 필요없이 작품을 다시로드 필요로한다.
우리는 레일을 이야기하고 있기 때문에 'require_dependency'를 사용하여 lib 디렉토리 / * .rb 파일을 '필요한'에, 가장 쉬운 방법입니다. 그래서 긴 대신의 컨트롤러 / 도우미 / 등 (응용 프로그램에서 .rb 파일 /)를 사용 require_dependency 아무것도 펑키 할 필요없이 작품을 다시로드 필요로한다.
내가 그 트랙을 내려 갔다 전에 일을 유일한 해결책은 hemju.com의 일이었다,하지만 난 정말 데브 속도의와 ApplicationController를 해킹하고 싶지 않았다.
-
==============================
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.레일 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.여기 내 버전은 레일 / 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.업데이트 대답
업데이트 대답
내 블로그에 내 모든 연구 결과를 정리해 보면, 당신은 더 나은 거기에 보면 :
올드 대답
나도 이것에 대한 솔루션을 주위를 둘러 보았다, 그리고 (이 방향으로 점 등으로도 완성도 '술에 대한) 여기 내가 찾은 것입니다.
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.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.노트에 레일 3 "load_once_paths"는 "autoload_once_paths을."가 있음
노트에 레일 3 "load_once_paths"는 "autoload_once_paths을."가 있음
또한, 명시 적으로 뭔가를 넣어하지 않는 한이 비어 있어야 것으로 보인다.
-
==============================
10.또한, 당신은 (@ dishod의 솔루션에 추가) application.rb에 다음 줄을 주석 있는지 확인하고 확인 모듈 이름은 파일 이름과 동일 있는지 확인 (그렇지 않으면 레일을 찾을 수 없습니다 )
또한, 당신은 (@ dishod의 솔루션에 추가) application.rb에 다음 줄을 주석 있는지 확인하고 확인 모듈 이름은 파일 이름과 동일 있는지 확인 (그렇지 않으면 레일을 찾을 수 없습니다 )
#Dir.glob("./lib/*.{rb}").each { |file| require file } # require each file from lib directory
-
==============================
11.응용 프로그램의 보석의 내부에 lib 디렉토리를 다시로드 레일 3.2.13 근무 :
응용 프로그램의 보석의 내부에 lib 디렉토리를 다시로드 레일 3.2.13 근무 :
require_dependency 'the_class'
과
config.autoload_paths + = %의 W (#} {config.root /../ 환상 / LIB)
from https://stackoverflow.com/questions/3282655/ruby-on-rails-3-reload-lib-directory-for-each-request by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 프로덕션 환경에서 레일 설치 태양 흑점 SOLR (0) | 2020.02.22 |
---|---|
[RUBY-ON-RAILS] 레일에서 슬러그 (사람이 읽을 수있는 ID를) 생성하는 가장 좋은 방법은 (0) | 2020.02.22 |
[RUBY-ON-RAILS] 어떻게해야합니까 사용 공장 소녀는 종이 클립 첨부 파일을 생성? (0) | 2020.02.22 |
[RUBY-ON-RAILS] 어떻게 레일에서 정적 콘텐츠를 할까? (0) | 2020.02.22 |
[RUBY-ON-RAILS] 내가보기에 현재 컨트롤러의 이름을받을 수 있나요? (0) | 2020.02.21 |