이건 정말로 이해가 잘 안 됩니다. 저는 기존 플러그인의 기능을 유지하면서, 플래그가 지정된 게시물을 채팅 클라이언트(제 경우에는 Discord)로 파이프할 수 있도록 하는 기능을 추가하고 싶었을 뿐입니다. 다시 한번 묻지만, 기존 플러그인의 많은 기능을 복제하고 제가 원했던 새로운 기능을 추가하는 완전히 새로운 플러그인을 처음부터 작성하라는 건가요? 역시 과한 것 같습니다.
일정 수준까지 기존 클래스의 로직을 대체하거나 확장할 수 있습니다. 이는 번들된 플러그인을 확장하는 하나의 방법이 될 수 있습니다. 수정된 로직만 추가하는 새로운 플러그인을 작성하면 됩니다. module prepend를 사용하면 됩니다.
enabled_site_setting :myoverridingplugin_enabled
module ::MyOverridingPlugin
PLUGIN_NAME = "my-overriding-plugin"
class Engine < ::Rails::Engine
engine_name MyOverridingPlugin::PLUGIN_NAME
isolate_namespace MyOverridingPlugin
end
module SomeClassOverrides
def overriding_method(foo, bar)
if foo == "something"
# do something custom
else
# this will call the original logic
super(f00, bar)
end
end
end
end
after_initialize do
SomeClass.prepend(MyOverridingPlugin::SomeClassOverrides)
end
그 마음 충분히 이해합니다. 그리고 저도 “플러그인을 코어에 번들링하는” 방식의 가장 큰 기술적 복잡성 중 하나로 이 문제를 꼽고 있습니다. 포크한 플러그인이 몇 개 있었는데, 번들링된 플러그인을 제거하지 않고는让它们 작동시키는 것이 매우 복잡했습니다.
제가 보기엔 Jay는 그런 의도는 아닌 것 같습니다. 플러그인은 다른 플러그인의 매우 구체적인 부분만 오버라이드할 수도 있습니다.
가장 좋은 접근 방식은 여러분의 코드가 공식 플러그인에 병합될 가치가 있다는 점을 팀을 설득하는 것입니다. 수정 사항이 충분히 일반적이거나 유연하다면 이것이 가능할 것입니다. 이미 포크를 만들었고 변경/추가 사항이 꽤 깔끔해 보입니다. 아마 하드코딩된 “Flagged” 문자열을 번역 파일로 옮기고, :flagged의 기본값을 false로 설정하면 추가 파라미터를 통해 원래의 이벤트 핸들러를 수정할 필요가 없게 됩니다. 그 외에는 병합할 가치가 있어 보입니다. 제가 당신이라면 최신 버전으로 업데이트하고 PR을 열어 플러그인 토픽에서 이 문제를 논의할 것입니다.
그 경로가 실패한다면, 단순히 여러분이 변경한 그 세 가지 함수를 오버라이드하고 on(:reviewable_created) 핸들러를 추가하는 플러그인을 구축하면 됩니다.
플러그인의 목적은 discourse를 포크할 필요가 없도록 하는 것입니다. 과도한 요구가 아니라, 플러그인이 존재하는 이유가 바로 이것입니다.
아니요. 당신의 플러그인은 단순히 플래그가 달린 게시물을 Discord로 보내는 새로운 기능을 추가하고, 이를 수행하기 위해 기존 코드를 호출하면 됩니다. 아마도 코드 10줄 정도면 충분할 것이며, upstream의 변경 사항을 당신의 플러그인에 병합할 필요도 없습니다. 편집: 제가 답글을 쓰기 전에 읽지 못했던 바로 직전 두 개의 게시물이 제안했던 내용과 같습니다.