Plugins principais onde um fork de um plugin mesclado estava sendo usado

Estou um pouco atrasado aqui, mas em relação à migração de plugins populares para o núcleo do Discourse, o que se deve fazer se alguém estava usando um fork modificado de um plugin que foi mesclado?

Para referência Set up Discord notifications with the discourse-chat-integration plugin - #71 by skatefriday eu adicionei a capacidade de enviar posts sinalizados para o Discord, pois é importante que os moderadores recebam notificação imediata de que um usuário sinalizou um post, e o Discord é o meio de comunicação de menor latência para isso.

O plugin de integração de chat do Discourse existente não tinha, e ainda não tem, esse recurso.

Há algum tempo, outro membro da minha equipe atualizou nosso servidor Discourse e, ao notar que o plugin agora estava nativamente incluído no Discourse, porque a compilação falhou na atualização, ele simplesmente removeu o clone do meu fork.

E agora percebi que meu recurso desapareceu.

Então, qual é a melhor prática quando uma instalação auto-hospedada estava usando um plugin modificado para restaurar os recursos do plugin modificado?

4 curtidas

A melhor coisa a fazer é escrever um plugin que substitua o plugin.

Outra coisa a fazer é, na linha antes de você clonar seu fork, você “rm - rf” o plugin mesclado.

Então faça exatamente isso no seu novo plugin em vez de fazer um fork do principal. Haverá um hook para fazer isso.

3 curtidas

[quote=“pfaffman, post:2, topic:394718”]A melhor coisa a fazer é escrever um plugin que substitua o plugin.

[/quote]

Escrever um plugin completamente novo? Isso parece excessivo.

[quote=“pfaffman, post:2, topic:394718”]Outra coisa a fazer é, na linha antes de você clonar seu fork, você usa “rm - rf” no plugin mesclado.

[/quote]

Esta é provavelmente a resposta.

[quote=“pfaffman, post:2, topic:394718”]Então faça exatamente isso no seu novo plugin em vez de fazer um fork do principal. Não haverá um hook para fazer isso.

[/quote]

Eu realmente não entendo nada disso. Eu queria a funcionalidade do plugin existente com a adição de poder dizer a ele para enviar posts sinalizados para o cliente de chat, no meu caso o Discord. Você está sugerindo novamente que eu escreva, do zero, um plugin completamente novo que duplique grande parte da funcionalidade do plugin existente e adicione o novo recurso que eu queria? Novamente, parece excessivo.

Em certa medida, você pode substituir/estender a lógica em classes existentes. Esta pode ser uma opção para estender o plugin empacotado. Você escreveria um novo plugin que apenas adiciona a lógica modificada. Usando 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"
				# faz algo personalizado
			else
				# isso chamará a lógica original
				super(f00, bar)
			end
		end
	end
end

after_initialize do
	SomeClass.prepend(MyOverridingPlugin::SomeClassOverrides)
end

Eu usei este construtor para limitar alguns controladores sob certas condições.

1 curtida

Eu concordo, e descobri que esta é uma das complicações técnicas mais impactantes do “empacotamento de plugins com o núcleo” também. Tínhamos alguns plugins ramificados (forked) e era muito complicado fazê-los funcionar sem remover o plugin empacotado.

Eu não acho que Jay esteja sugerindo isso. Um plugin também pode sobrescrever partes muito específicas de outro plugin.

A melhor abordagem seria convencer a equipe de que seu código vale a pena ser mesclado (merged) no plugin oficial. Isso funcionará se sua modificação for genérica ou flexível o suficiente. Vejo que você já criou um fork e suas alterações/adições estão bem limpas. Talvez a string “Flagged” codificada pudesse estar em um arquivo de tradução e, se você fizer com que :flagged seja false por padrão, você não precisará modificar o manipulador de eventos original com um parâmetro extra, mas fora isso, parece válido. Se eu fosse você, eu o atualizaria, abriria um PR e discutiria isso no tópico do plugin.

Se esse caminho falhar, você pode simplesmente criar um plugin que sobrescreva as três funções que você alterou e adicione o manipulador on(:reviewable_created).

2 curtidas

O objetivo dos plugins é que você não precise fazer um fork do Discourse. Não é excessivo, é para isso que os plugins existem.

Não. Seu plugin simplesmente adicionará o novo recurso para enviar posts sinalizados para o Discord e chamará o código existente para fazer isso. Provavelmente são dez linhas de código e não exigirá que você mescle alterações upstream no seu plugin. ED: Como as últimas duas postagens que eu não li antes de responder sugeriram. :person_shrugging: