병합된 플러그인의 포크가 사용되었던 핵심 플러그인

조금 늦게 참여하는 것 같지만, 인기 있는 플러그인들을 코어 디스코스로 마이그레이션하는 것과 관련하여, 병합된 플러그인의 수정된 포크를 사용 중이었다면 어떻게 해야 할까요?

참고로 Set up Discord notifications with the discourse-chat-integration plugin - #71 by skatefriday 에서, 사용자가 게시물을 신고하면 관리자가 즉시 알림을 받아야 하기 때문에, 이 용도로 가장 낮은 지연 시간을 가진 커뮤니케이션 수단인 디스코드로 신고된 게시물을 전달하는 기능을 추가했습니다.

기존의 디스코러스 채팅 통합 플러그인에는 이 기능이 없었고, 현재에도 여전히 없습니다.

얼마 전 제 팀의 다른 멤버가 디스코러스 서버를 업데이트하던 중, 해당 플러그인이 이제 디스코스에 네이티브로 번들링된 것을 인지하고, 업데이트 시 빌드가 실패하자 제 포크의 클론을 단순히 삭제해 버렸습니다.

그리고 나서야 제가 추가했던 기능이 사라진 것을 알게 되었습니다.

따라서 셀프 호스팅 환경에서 수정된 플러그인을 사용 중이었다면, 수정된 플러그인의 기능을 복원하는 가장 좋은 방법은 무엇일까요?

가장 좋은 방법은 해당 플러그인을 오버라이드하는 플러그인을 작성하는 것입니다.

또 다른 방법은 포크를 클론하기 전 라인에서 병합된 플러그인을 "rm - rf"로 삭제하는 것입니다.

따라서 메인 플러그인을 포크하는 대신 새 플러그인에서 그렇게 하세요. 그렇게 할 수 있는 훅이 있을 것입니다.

완전히 새로운 플러그인을 작성하라는 건가요? 그건 좀 과한 것 같습니다.

이것이 아마도 정답일 것 같습니다.

이건 정말로 이해가 잘 안 됩니다. 저는 기존 플러그인의 기능을 유지하면서, 플래그가 지정된 게시물을 채팅 클라이언트(제 경우에는 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의 변경 사항을 당신의 플러그인에 병합할 필요도 없습니다. 편집: 제가 답글을 쓰기 전에 읽지 못했던 바로 직전 두 개의 게시물이 제안했던 내용과 같습니다. :person_shrugging: