2017-02-02 18 views
1

레일즈 응용 프로그램 (Redmine)을 디버깅하고 플러그인의 경로 또는 라이브러리를 변경할 때마다 레일스를 다시 시작해야합니다. .다시 시작하지 않고 레일스 응용 프로그램을 디버깅

이 내 서버처럼 보이는 방법입니다

이 가
rails s 
=> Booting WEBrick 
=> Rails 3.2.16 application starting in development on http://0.0.0.0:3000 
=> Call with -d to detach 
=> Ctrl-C to shutdown server 
[2017-02-02 17:06:18] INFO WEBrick 1.3.1 
[2017-02-02 17:06:18] INFO ruby 2.1.8 (2015-12-16) [x86_64-darwin15.0] 
[2017-02-02 17:06:18] INFO WEBrick::HTTPServer#start: pid=12042 port=3000 

사람이 부분적으로 영향을받은 클래스 또는 변경이나과를 다시로드 응용 프로그램을 강제 할 수있는 방법을 알고 있나요?

+0

레일즈 애플리케이션의 일부 측면은 서버가 시작될 때 초기화 프로그램 등으로 실행/해석됩니다. – MurifoX

답변

2

Redmine 플러그인의 init.rb 파일에서 패치를로드했을 것입니다. 그것은 그들을 포위하는 좋은 방법입니다 :

ActionDispatch::Reloader.to_prepare

이 콜백을 사용하여 패치를 개발 모드에서 각 요청하기 전에 다시 적용됩니다. 당신은 아직도 당신이 경로를 변경하는 경우 서버를 다시 시작해야

require 'redmine' 
ActionDispatch::Reloader.to_prepare do 
    require_dependency 'redmine_multiprojects_issue/issue_patch' 
    require_dependency 'redmine_multiprojects_issue/issues_helper_patch' 
    require_dependency 'redmine_multiprojects_issue/issues_controller_patch' 
end 
Redmine::Plugin.register :redmine_multiprojects_issue do 
    ... 
end 

참고 : 여기에

은 예입니다.

+0

아 그래! 이 콜백을 찾고 있었지만 호출 된 것을 기억하지 못했습니다! – phoet

+0

하지만 이렇게하면 생산이 느려지고 불필요하게 다시로드됩니까? 개발 중에 만 사용해야합니까? –

+2

이 콜백을 사용하면 매우 유용합니다. 블록은 프로덕션 모드에서 한 번만 호출됩니다. 레일스의 코드 재로드가 비활성화되었으므로 블록은 개발 모드에서 다시로드 될 때마다 호출됩니다. 몇 가지 변형이 있는데, 최근에'Rails.configuration.to_prepare do'를 사용하여 동일한 결과를 얻었습니다. – jkraemer

1

시작 프로세스가 꽤 오래 걸립니다. 대부분의 시간은 보석 의존성을로드하기 때문입니다. 당신은 모든 요청에 ​​그렇게 할 경우 결코 적은, 그것을 여기에 설명 좋아 할 수있는 몇 가지 방법이 없습니다 :

초기화 만 초기화 중에 실행되는 한, 레일이 그것들을 재연하지 않는다는 것을 의미합니다. 당신은 원숭이 패치에 의존하는 경우, Reload rails initializers

  • https://simonecarletti.com/blog/2011/04/understanding-ruby-and-rails-lazy-load-hooks/

    • 여기에 설명 된 그 주위에 방법이
  • 1

    레드 마인 플러그인은 일반적으로하지 루비 보석이지만 주요 레일 응용 프로그램 내부의 폴더에 살고있다 .

    플러그인 작성자가 몇 가지 Rails 우수 사례를 따르면 Rails의 자동 로딩은 Redmine 플러그인에서도 가능합니다. 있습니다에 기본적인 것들을주의해야 할 :

    • 적절한 이름과 네임 스페이스 지정 -
    • 결코 lib/foo/bar/baz.rb에서 Foo::Bar::Baz 삶을 수동으로 물건을 필요로 즉 그들이 선언 클래스/모듈에 해당하는 모듈과 파일 이름에 해당하는 하위 디렉토리를 가지고, 하지만 레일의 자동로드 모든
    • 주의하자 언제 어디서 당신이 패치가하는 일을 패치 플러그인 작성자는 플러그인의 코드 규칙을 따르는 경우 자동이

    를 다시로드하는 동안 다시 적용 아마도 자동 로딩을하고 잘로드 할 것입니다. 한 가지 예외는 플러그인의 init.rb이지만 플러그인 개발 중에는 대개 자주 변경되지 않습니다.

    실제로 많은 Redmine 플러그인은 이러한 규칙을 위반하여 자동 로딩을 중단합니다. 재로드가 시도 될 때 증상은 자동 재로드가 아니거나 응용 프로그램 오류가 될 수 있으므로 프로덕션 모드에서는 정상적으로 작동하지만 개발 모드에서 첫 번째 요청이 성공한 후에는 실패하는 응용 프로그램이 발생합니다.

    종종 레일즈의 기대와 일치하는 플러그인 코드를 재구성하고 require 문을 제거하는 것만으로도 이런 종류의 문제를 해결할 수 있습니다.

    플러그인으로 선언 된 경로를 변경하더라도 서버를 다시 시작해야하지만 Redmine에 자동으로 다시로드하는 방법을 모르겠습니다.

    +0

    안녕하세요, 시작해 주셔서 감사합니다 ... 여기에 몇 가지 예를 들려 줄 수 있습니까? 이유는, 나는 항상 init.rb에서 필요하고 레일즈 * to_prepare 이벤트가 완료되었을 때 적용된 패치도있다. – rupeshj

    +0

    to_prepare 블록에 패치를 적용하는 것이 좋습니다. 문제는 수동으로 아무것도 요구해서는 안된다는 것입니다. 적절한 네이밍과 네임 스페이스를 사용하면'require_dependency'를 사용하는 것조차 필요하지 않습니다. 비록 당신이해야한다면, 후자는 Rails의 코드 재로드를 중단시키지 않기 때문에 항상 더 좋습니다. – jkraemer