Pavilion은 구독 클라이언트를 시작으로 일부 Discourse 플러그인을 ruby gem으로 패키징하기 시작했습니다.
구독 클라이언트는 여전히 이 gem을 로드하는 별도의 플러그인이지만, 백엔드는 이제 완전히 gem으로 패키징되었으며, 이 별도의 플러그인은 곧 완전히 비활성화(deprecated)될 예정입니다. gem으로 패키징하기에 더 적합한 플러그인에서 동일한 작업을 수행하는 방법에 대한 간단한 안내를 드립니다.
gem 작업 방법
먼저, ruby gem을 다루는 방법을 이해해야 합니다. 이전에 gem을 생성해 본 적이 없다면, Discourse 플러그인을 gem으로 다루기 전에 먼저 독립적으로 표준 gem을 하나 만들어 보시길 권장합니다. 다음 가이드를 권장합니다.
플러그인이 Discourse에 코드를 주입하는 방식
Discourse 플러그인 gem이 Discourse에 코드를 주입하는 방식은 표준 플러그인이 코드를 주입하는 방식과 정확히 동일합니다. 유일한 차이는 패키징 방식입니다. 따라서 플러그인을 gem으로 다루려면 표준 플러그인이 Discourse에 코드를 주입하는 방식도 이해해야 합니다. 여기서는 기본적으로 두 가지를 이해해야 합니다.
-
Discourse 플러그인은 rails engine입니다. 이미 알고 계실 가능성이 높지만, 이것이 무엇을 의미하는지 제대로 이해해야 합니다. Rails engines에 대한 이 가이드를 읽어보시길 권장합니다. 예를 들어, Discourse 플러그인의
plugin.rb파일 내의 많은 코드가after_initialize콜백으로 감싸져 있는 이유를 이해해야 합니다. -
Discourse 초기화 프로세스가 작동하는 방식입니다. 여기서 읽어야 할 파일은 하나뿐이며, 바로 discourse/discourse/config/application.rb 파일입니다. 대부분의 rails 코드가 로드되고, 모든 플러그인 코드가 로드되며, 플러그인이 초기화되는 곳이 바로 이 파일입니다. 이 파일을 깊이 있게 살펴보고, 플러그인 파일이 어디서 어떻게 require되고 초기화되는지 이해해야 합니다.
gem 형태의 Discourse 플러그인 작동 방식
모든 것을 종합하기 위해, 위에서 언급한 두 가지 주제가 Discourse 플러그인 gem에서 어떻게 결합되는지 이해해야 합니다. 특히 다음 사항을 유의하십시오.
-
Discourse 플러그인 gem에서
engine.rb파일은plugin.rb파일과 유사한 역할을 수행하며, 몇 가지 설정상의 차이가 있습니다. 구독 클라이언트 gem의 engine.rb 파일을 확인하고 표준 plugin.rb 파일과 비교해 보세요. -
Discourse 플러그인 gem에서는 gem을 올바르게 테스트하기 위해 rspec 테스트에서
discourse/discourse를 목(mock)으로 처리해야 합니다. Discourse 앱 전체를 목으로 처리할 필요는 없으며, 테스트하는 부분만 목으로 처리하면 됩니다. 필요한 특정 Discourse 클래스와 엔드포인트를 갖춘 스켈레톤 rails 앱을 생성하고 이를 rspec 지원 파일로 로드하여 이를 수행합니다. 구독 클라이언트 gem의 목 Discourse 앱과 spec rails_helper.rb에서 로드되는 위치를 참고하세요.
Discourse 플러그인에서 로컬 gem 로드하기
개발 중에 해당 플러그인과 gem을 함께 작업할 때, Discourse 플러그인에서 gem의 로컬 버전을 로드하려면 다음 작업을 수행해야 합니다.
gem 폴더를 관련 플러그인의 gem 폴더에 심볼릭 링크(Symlink)를 만듭니다. 예를 들어, discourse-subscription-client 플러그인에서 discourse_subscription_client gem의 로컬 버전을 작업하려면 다음과 같이 수행합니다.
ln -s /Users/angus/discourse/gems/discourse_subscription_client /Users/angus/discourse/discourse/plugins/discourse-subscription-client/gems/3.2.1/gems
그런 다음 플러그인 내의 심볼릭 링크된 gem 폴더 이름을 표준 gem 폴더와 동일한 이름 패턴으로 변경합니다. 예:
discourse_subscription_client-0.1.0.pre11
이제 플러그인이 로드될 때 rubygems에 있는 버전이 아닌 로컬 버전의 Discourse 플러그인 gem이 로드됩니다.
질문이 있거나 막힌 부분이 있다면 여기에 게시하면 도와드리겠습니다.