Discourse에서 플러그인을 만드는 것은 몇 가지 특이한 점을 익히면 정말 간단할 수 있습니다. 이 글의 목표는 스켈레톤 플러그인을 생성하고 기본 개념을 소개하는 것입니다.
개발 환경
컴퓨터에서 Discourse 개발 환경이 실행 중인지 확인하세요. 해당 설정 가이드를 사용하는 것을 권장하며, 완료 후 다시 돌아오시기 바랍니다.
plugin.rb
https://github.com/discourse/discourse-plugin-skeleton을 사용하여 플러그인 디렉터리에서 완전한 discourse 플러그인 스켈레톤을 생성하세요
스켈레톤은 이제 discourse 코어에 번들링되어 있으며,
rake plugin:create[plugin-name]을 사용하면 스켈레톤을 기반으로 플러그인을 생성할 수 있습니다.
Discourse가 시작될 때 plugins 디렉터리에서 plugin.rb 파일을 포함하는 하위 디렉터리를 찾습니다. plugin.rb 파일에는 두 가지 목적이 있습니다. 첫째, 플러그인의 매니페스트로 플러그인에 대한 필수 정보(이름, 연락처 정보, 설명)를 포함합니다. 둘째, 플러그인 실행에 필요한 ruby 코드를 초기화하는 역할을 합니다.
우리의 경우 ruby 코드를 추가하지는 않지만, 여전히 plugin.rb가 필요합니다. basic-plugin 디렉터리를 만들고 그 안에 다음 내용을 가진 plugin.rb 파일을 생성해 보겠습니다:
basic-plugin/plugin.rb
# name: basic-plugin
# about: A super simple plugin to demonstrate how plugins work
# version: 0.0.1
# authors: Awesome Plugin Developer
# url: https://github.com/yourusername/basic-plugin
이 파일을 생성한 후 로컬 서버를 재시작하면 플러그인이 로드되어야 합니다.
중요한 함정!
일반적인 rails 개발에 익숙하다면, 플러그인은 리로딩(reloading) 측면에서 다소 불편할 수 있다는 점을 알게 될 것입니다. 일반적으로 플러그인에 변경 사항을 적용한 후에는 Ctrl+c를 눌러 서버를 중지한 후, bin/dev를 사용하여 다시 실행해야 합니다.
변경 사항이 반영되지 않았습니다! 
때로는 캐시가 완전히 정리되지 않을 수 있으며, 특히 새 파일을 생성하거나 기존 파일을 삭제할 때 그렇습니다. 이 문제를 해결하려면 tmp 폴더를 삭제하고 rails를 다시 시작하세요. Mac에서는 한 명령어로 수행할 수 있습니다: rm -rf tmp; bin/dev.
플러그인이 로드되었는지 확인하기
로컬 서버를 재시작한 후 /admin/plugins URL을 방문하세요(플러그인 레지스트리는 관리자만 볼 수 있으므로 먼저 관리자 계정으로 로그인했는지 확인하세요).
모든 것이 정상적으로 작동했다면 목록에서 플러그인을 볼 수 있어야 합니다:
축하합니다, 이제 첫 번째 플러그인을 만든 것입니다!
자바스크립트 추가하기
현재 플러그인은 아무것도 하지 않습니다. Discourse가 로드될 때 알림(alert) 상자를 표시하는 자바스크립트 파일을 추가해 보겠습니다. 이는 사용자에게 매우 귀찮을 수 있으며 실제 플러그인으로는 권장되지 않지만, 실행 중인 애플리케이션에 자바스크립트를 삽입하는 방법을 보여줍니다.
다음 파일을 생성하세요:
plugins/basic-plugin/assets/javascripts/discourse/initializers/alert.js
export default {
name: "alert",
initialize() {
alert("alert boxes are annoying!");
},
};
이제 로컬 서버를 재시작하면 화면에 "alert boxes are annoying!"라는 메시지가 표시되어야 합니다. (표시되지 않았다면 위의 “변경 사항이 반영되지 않았습니다!” 섹션을 참조하세요.)
이것이 어떻게 작동했는지 단계별로 살펴봅시다:
-
assets/javascripts/discourse/initializers에 배치된 자바스크립트 파일은 Discourse 애플리케이션이 로드될 때 자동으로 실행됩니다. -
이 특정 파일은
name과initialize함수를 가진 하나의 객체를export합니다. -
name은 고유해야 하므로alert라고 이름 붙였습니다. -
initialize()함수는 애플리케이션이 로드될 때 호출됩니다. 우리의 경우, 이 함수는 단순히 우리의alert()코드를 실행할 뿐입니다.
이제 공식적인 Discourse 플러그인 개발자가 되었습니다!
시리즈의 나머지 부분
Part 1: 이 주제
Part 2: Plugin Outlets
Part 3: Site Settings
Part 4: git setup
Part 5: Admin interfaces
Part 6: Acceptance tests
Part 7: Publish your plugin
이 문서는 버전 관리되고 있습니다 - 변경 사항을 github에서 제안할 수 있습니다.

