Discourse 플러그인을 gem으로 패키징하기

Pavilion은 구독 클라이언트를 시작으로 일부 Discourse 플러그인을 ruby gem으로 패키징하기 시작했습니다.

구독 클라이언트는 여전히 이 gem을 로드하는 별도의 플러그인이지만, 백엔드는 이제 완전히 gem으로 패키징되었으며, 이 별도의 플러그인은 곧 완전히 비활성화(deprecated)될 예정입니다. gem으로 패키징하기에 더 적합한 플러그인에서 동일한 작업을 수행하는 방법에 대한 간단한 안내를 드립니다.

gem 작업 방법

먼저, ruby gem을 다루는 방법을 이해해야 합니다. 이전에 gem을 생성해 본 적이 없다면, Discourse 플러그인을 gem으로 다루기 전에 먼저 독립적으로 표준 gem을 하나 만들어 보시길 권장합니다. 다음 가이드를 권장합니다.

플러그인이 Discourse에 코드를 주입하는 방식

Discourse 플러그인 gem이 Discourse에 코드를 주입하는 방식은 표준 플러그인이 코드를 주입하는 방식과 정확히 동일합니다. 유일한 차이는 패키징 방식입니다. 따라서 플러그인을 gem으로 다루려면 표준 플러그인이 Discourse에 코드를 주입하는 방식도 이해해야 합니다. 여기서는 기본적으로 두 가지를 이해해야 합니다.

  1. Discourse 플러그인은 rails engine입니다. 이미 알고 계실 가능성이 높지만, 이것이 무엇을 의미하는지 제대로 이해해야 합니다. Rails engines에 대한 이 가이드를 읽어보시길 권장합니다. 예를 들어, Discourse 플러그인의 plugin.rb 파일 내의 많은 코드가 after_initialize 콜백으로 감싸져 있는 이유를 이해해야 합니다.

  2. Discourse 초기화 프로세스가 작동하는 방식입니다. 여기서 읽어야 할 파일은 하나뿐이며, 바로 discourse/discourse/config/application.rb 파일입니다. 대부분의 rails 코드가 로드되고, 모든 플러그인 코드가 로드되며, 플러그인이 초기화되는 곳이 바로 이 파일입니다. 이 파일을 깊이 있게 살펴보고, 플러그인 파일이 어디서 어떻게 require되고 초기화되는지 이해해야 합니다.

gem 형태의 Discourse 플러그인 작동 방식

모든 것을 종합하기 위해, 위에서 언급한 두 가지 주제가 Discourse 플러그인 gem에서 어떻게 결합되는지 이해해야 합니다. 특히 다음 사항을 유의하십시오.

  1. Discourse 플러그인 gem에서 engine.rb 파일은 plugin.rb 파일과 유사한 역할을 수행하며, 몇 가지 설정상의 차이가 있습니다. 구독 클라이언트 gem의 engine.rb 파일을 확인하고 표준 plugin.rb 파일과 비교해 보세요.

  2. 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이 로드됩니다.

질문이 있거나 막힌 부분이 있다면 여기에 게시하면 도와드리겠습니다.

14개의 좋아요

이 접근 방식으로는 Discourse 테마 관련 사항을 플러그인으로 처리할 수 없는 것 같습니다. 제목을 “Discourse 전용 Rails Engine을 gem으로 패키징하기”로 변경하는 것이 더 적합할 수도 있습니다.

1개의 좋아요

맞습니다. 프론트엔드 JS 프레임워크 관련 사항은 별도로 처리해야 합니다.

기술적으로는 정확하지만, 그런 제목이 더 낫다고 동의하지 않습니다. 그렇게 하면 해당 토픽을 읽어야 할 적절한 사람들이 읽기를 꺼려할 수 있기 때문입니다. 플러그인을 작성하는 대부분의 사람들은 자신을 “Discourse 전용 Rails Engine” 개발자로 인식하지 못할 수 있습니다.

실제로 저는 이제 코드를 백엔드 플러그인과 프론트엔드 테마 컴포넌트로 더 자주 분리합니다. 이렇게 하면 스테이징 및 프로덕션 환경에 배포할 때 프론트엔드 부분을 매우 빠르게 반복 개발(iterate)할 수 있습니다.

3개의 좋아요

저도 동의합니다. 이 문서는 고급 개발자만 유용할 수 있지만, 모든 개발자를 대상으로 해야 합니다.

이 내용을 공유해 주셔서 감사합니다.

1개의 좋아요

고급 주제인 데 동의합니다.