Discourse 플러그인 개발 - 1부 - 기본 플러그인 만들기

Hmmmm. That’s a tricky one, because the symlink needed to be deleted, otherwise the Docker mount fails (as it cannot overwrite the existing file).

I had a bit of a google around for solutions, and found an interesting solution which would dereference the symlink and copy the symlink’s target into the specified directory, but couldn’t find anything that would create a Docker volume mount, thus preserving the dynamic link and bi-directional synchronisation. Happy to be steered towards a solution as this would be a neat feature to have.

app/models/user.rb 모델에 검증을 추가하는 방법을 알려 주세요.

1개의 좋아요

plugin.rb에서 이를 수행하려면 일반 Ruby 코드를 사용할 수 있습니다:

class ::User < ActiveRecord::Base
  validates_presence_of :your_attribute
end
6개의 좋아요

첫 번째 작은 플러그인을 만들기 시작했어요 :blush: 몇 가지 질문이 있는데, 누가 도와줄 수 있을까요…

첫 번째 질문은 이 가이드에 있는 것을 사용해도 되는지, 아니면 정말로 플러그인 생성기를 사용해야 하는지 여부입니다.

이 가이드에서는 다루지 않았지만, plugin.rb 파일에서 데이터를 템플릿에 어떻게 사용할 수 있게 할 수 있을까요?

예를 들어, 누군가가 토픽을 방문할 때마다 topic-above-posts 플러그인 아웃렛에 랜덤한 환영 메시지를 표시하고 싶다고 가정해 보겠습니다. 이 메시지는 plugin.rb에 있는 배열에서 랜덤으로 선택됩니다… 그렇다면 이 데이터를 템플릿으로 어떻게 전송해야 할까요? 그리고 이 템플릿도 아마 여기에 있어야 할 것 같습니다:

plugins/my_new_plugin/assets/javascripts/discourse/templates/connectors/topic-above-posts/my_new_plugin.hbs (이 위치가 맞나요?)

팁을 주시면 매우 감사하겠습니다 :blush:

2개의 좋아요

플러그인 생성기를 사용하는 것은 시작하는 데 일반적으로 좋은 방법이며, 플러그인이 어떻게 구조화되어야 하는지 살펴볼 수 있습니다. 이를 권장합니다.

자바 코드를 프론트 엔드에 포함하는 방법에 대해 말씀드리자면, 이는 두 개의 다른 애플리케이션입니다. 프론트 엔드 애플리케이션(Ember)은 서버(Rails)에서 이를 요청해야 합니다. 일반적으로 AJAX 호출을 통해 이렇게 하지만, SiteSerializer에 추가하여 포럼 데이터의 일부로 자동으로 전송되도록 하는 것과 같은 다른 방법도 사용할 수 있습니다.

그렇지 않다면, rails에서 라우트/컨트롤러를 추가하는 방법과 메시지를 JSON으로 전송하는 방법을 찾아봐야 합니다.

8개의 좋아요

로빈, 고마워요!

이거에 대한 튜토리얼이 있는지 혹시 아세요? 아니면, 방향을 잡아줄 수 있는 간단한 플러그인(혹은 더미 플러그인)이 있을까요? (없다면, 어딘가에 빠르게 올려주실 수 있을까요? 많은 분들에게 도움이 될 것 같아요 :blush:)

그리고.. 책 쓰기에 대한 추가적인 생각이 있으신가요? 관심 있으시다면 누군가에게 소개해 드릴 수 있어요 :smiley:

1개의 좋아요

칭찬해 주셔서 감사하지만, 저는 책 쓰기를 고려할 정도로 여유가 전혀 없습니다. 게다가 기술 서적은 독자가 매우 제한적이에요. 실제로 책을 쓴 지인들은 돈이 아니라 자기 자신을 위해 쓴다고 하더군요 :slight_smile:

서버 측에서 무언가를 반환하는 간단한 플러그인은 떠오르지 않네요. discourse-tooltips는 라우트를 추가한 뒤 마우스를 올렸을 때 토픽 미리보기 가져오기에 이를 활용하는데, 참고가 될 수도 있겠네요.

8개의 좋아요

곧 플러그인 개발을 시작할 예정입니다…

질문:

실제로 plugin을 사용할 수 있는 hooks 목록이 있나요?

예를 들어, post의 cooked 데이터를 표시하기 전에 처리하는 플러그인을 작성한다고 가정해 보겠습니다. 그렇다면 (예를 들어) 시작 부분에 하나, 끝 부분에 하나, 다음과 같은 최소 하나의 hook가 있어야 할 것으로 예상합니다:

  • display_post_start

  • display_post_complex

그런 다음, 우리의 plugin은 위 목록 중 원하는 hook location에 코드를 hook합니다.

이러한 plugin hooks 목록이 있으며, DiscourseWorld에서 이러한 plugin hooks는 무엇이라고 불리는가요?

업데이트: 이걸 찾았습니다:

git grep "plugin-outlet" -- "*.hbs"

하지만 제가 볼 수 있는 범위 내에서는 게시물의 cooked 내용을 수정하기 위한 outlet이 없었습니다.

예를 들어, 게시물의 cooked 부분을 수정하기 위한 outlet처럼, 자체 outlet을 만드는 방법에 대한 튜토리얼이 있나요?

2개의 좋아요

이 가이드의 decorateCooked() 섹션을 찾고 계신 거죠:

5개의 좋아요

이 스켈레톤을 커스텀 플러그인에 사용 중입니다. 다가오는 Ember 5 전환을 위해 변경해야 할 부분이 있나요?

아마도 필요 없을 것 같은데? 이거 그냥 린터(linter)이니까요?

1개의 좋아요

이 스켈레톤은 Ember 5와 호환됩니다. 하지만 JavaScript 코드나 hbs 템플릿을 추가했다면, 공지사항에 설명된 대로 비추천(deprecation) 항목을 확인해야 합니다.

네, package.json에 있는 내용은 린팅과 관련된 것뿐이며, 플러그인의 기능이나 호환성에 영향을 주지 않습니다.

3개의 좋아요

이 내용을 추가해 주세요

rake plugin:create[plugin-name]

오늘 이 rake 작업의 이름이 이거였다는 걸 기억하지 못해서(왜 기억하지 못했을까요?! :person_shrugging: ) Automating Discourse Plugin Setup with `create-discourse-plugin` gem 을 찾으려고 너무 오래 걸렸습니다

5개의 좋아요

Docker 설정을 사용하는 경우에도 주의를 덧붙이고 싶습니다. 위의 지침을 따를 경우 다음과 유사한 오류로 실패할 수 있습니다.

ambientimpact:~/.../Discourse/discourse$ d/rake plugin:create[neurocracy-date-rewrite]
Cloning 'https://github.com/discourse/discourse-plugin-skeleton' to '/src/plugins/neurocracy-date-rewrite'...
Initializing git repository...
Initialized empty Git repository in /src/plugins/neurocracy-date-rewrite/.git/
Author identity unknown

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: empty ident name (for <discourse@localhost>) not allowed
rake aborted!
Command failed with exit 128: git
/src/lib/tasks/plugin.rake:354:in `system'
/src/lib/tasks/plugin.rake:354:in `block (2 levels) in <main>'
/src/lib/tasks/plugin.rake:344:in `chdir'
/src/lib/tasks/plugin.rake:344:in `block in <main>'
Tasks: TOP => plugin:create
(See full trace by running task with --trace)

플러그인을 생성하기 전에 컨테이너 내부에서 .gitconfig를 설정해야 합니다(이메일과 이름을 필요에 맞게 변경하십시오):

d/exec git config --global user.email "you@example.com"
d/exec git config --global user.name "Your Name"
d/rake plugin:create[plugin-name]
1개의 좋아요