Rails 5 : 프로덕션 환경에서 lib 파일로드
내 앱 중 하나를 Rails 4.2.6에서 Rails 5.0.0으로 업그레이드했습니다. 업그레이드 가이드 자동로드 기능이 기본으로 생산에서 비활성화되어 있음을 말한다.
이제 파일에 자동로드가있는 모든 lib 파일을로드하기 때문에 항상 프로덕션 서버에서 오류가 발생 application.rb
합니다.
module MyApp
class Application < Rails::Application
config.autoload_paths += %W( lib/ )
end
end
지금은 config.enable_dependency_loading
~을 설정 true
했지만 더 나은 해결책이 있는지 궁금합니다. 프로덕션 환경에서는 기본적으로 자동 로딩이 비활성화되어 있어야합니다.
Rails 5로 이동 한 후의 변경 사항 목록 :
- 장소
lib
에 디렉토리app
응용 프로그램 내부의 모든 코드가 있기 때문에 자동으로 적재 dev에와 열망로드 가장 중요한 자극과입니다 autoreloaded 는 서버에게 당신이 바꿀 때마다 아파치를 재시작 할 필요가 없습니다 개발. - 파일 / 디렉토리 이름이 올 바르면 자동으로로드되기 때문에
require
내부에서 자신의 클래스를 가리키는 명령문을 제거하십시오. 명령문lib
을 남겨두면 자동 재로드require
가 중단 될 수 있습니다. 더 많은 정보는 여기에 - 개발
config.eager_load = true
환경에서 코드 로딩 문제를 간절히하도록 모든 환경에서 설정 하십시오. Rails.application.eager_load!
"순환 종속성"오류를 피하기 위해 스레드를 가지고 놀기 전에 사용하십시오 .루비 / 레일 확장명을 가진 경우 해당 코드를 이전
lib
디렉토리에 그대로두고 이니셜 라이저에서 수동으로로드하십시오. 이렇게하면 확장에 의존 할 수있는 추가 논리 전에 확장을로드 할 수 있습니다.# config/initializers/extensions.rb Dir["#{Rails.root}/lib/ruby_ext/*.rb"].each { |file| require file } Dir["#{Rails.root}/lib/rails_ext/*.rb"].each { |file| require file }
방금 github 댓글에 akostadinov라는 언급 config.eager_load_paths
대신 사용 했습니다 config.autoload_paths
: https://github.com/rails/rails/issues/13142#issuecomment-275492070
# config.autoload_paths << Rails.root.join('lib')
config.eager_load_paths << Rails.root.join('lib')
개발 및 프로덕션 환경에서 작동합니다.
감사합니다 요한 제안을 대체 할 #{Rails.root}/lib
함께 Rails.root.join('lib')
!
스레드 안전으로 인해 프로덕션 환경에서 자동로드가 비활성화되었습니다. 링크를 위해 @ Зелёный에게 감사합니다.
Github에서 권장하는대로 lib 파일 lib
을 내 app
디렉토리 의 폴더에 저장 하여이 문제를 해결했습니다 . 폴더의 모든 폴더는 Rails에 의해 자동으로로드됩니다.app
프로덕션 환경에서는 기본적으로 자동 로딩이 비활성화되어 있어야합니다.
이 문제에 대한 긴 토론이 있습니다. https://github.com/rails/rails/issues/13142
이를 통해 lib 자동 재로드가 가능하며 프로덕션 환경에서도 작동합니다.
추신 : 나는 대답을 변경했다. 이제 환경과 무관하게 열렬한 자동로드 경로에 추가하여 사용자 정의 환경에서도 작업을 수행 할 수 있습니다 (무대와 같은)
# config/initializers/load_lib.rb
...
config.eager_load_paths << Rails.root.join('lib')
config.autoload_paths << Rails.root.join('lib')
...
어떤 의미에서, Rails 5에는 열악한 자동로드 구성을 중앙 집중화하는 통합 된 접근 방식이 있으며, 동시에 열성적인로드가 구성 될 때마다 필요한 자동로드 경로를 추가하면 제대로 작동하지 않습니다.
# config/application.rb
...
config.paths.add Rails.root.join('lib').to_s, eager_load: true
# as an example of autoload only config
config.paths.add Rails.root.join('domainpack').to_s, autoload: true
...
나와 같은 사람으로 어려움을 겪고있는 사람에게는 디렉토리를 디렉토리에 두는 것만으로는 충분하지 않습니다 app/
. 그렇습니다. 자동 로딩이 가능하지만 다시로드 할 필요는 없습니다 . 네임 스페이스 규칙을 준수해야 합니다.
또한 이전 루트 수준을로드하는 데 이니셜 라이저를 사용 lib
하면 개발 중에 다시로드 기능을 사용할 수 없습니다.
Moving the lib folder to app helped solve a problem, my Twitter api would not run in production. I had "uninitialized constant TwitterApi" and my Twitter API was in my lib folder. I had config.autoload_paths += Dir["#{Rails.root}/app/lib"]
in my application.rb but it didn't work before moving the folder.
This did the trick
to summarize Lev's answer: mv lib app
was enough to have all my lib
code autoloaded / auto-reloaded.
(rails 6.0.0beta3 but should work fine on rails 5.x too)
참고URL : https://stackoverflow.com/questions/38198668/rails-5-load-lib-files-in-production
'Programing' 카테고리의 다른 글
Google Maps InfoWindow 스타일링 (0) | 2020.08.02 |
---|---|
템플릿 바인딩과 바인딩은 무엇입니까? (0) | 2020.07.30 |
id ()로 객체를 가져 옵니까? (0) | 2020.07.30 |
jQuery에서 width, innerWidth 및 outerWidth, height, innerHeight 및 outerHeight의 차이점은 무엇입니까? (0) | 2020.07.30 |
.htaccess에서 하나의 특정 폴더에 대한 액세스 거부 (0) | 2020.07.30 |