Criar um plugin no Discourse pode ser realmente simples, assim que você aprender algumas peculiaridades. O objetivo deste post é criar um esqueleto de plugin e apresentar os conceitos básicos.
Seu ambiente de desenvolvimento
Certifique-se de ter um ambiente de desenvolvimento do Discourse em execução no seu computador. Recomendo que você use o guia de configuração apropriado e volte quando terminar.
plugin.rb
Use GitHub - discourse/discourse-plugin-skeleton: Template for Discourse plugins · GitHub para criar um esqueleto completo de plugin do Discourse no seu diretório de plugins
O esqueleto agora está incluído no núcleo do Discourse;
rake plugin:create[nome-do-plugin]criará um plugin usando o esqueleto.
Quando o Discourse inicia, ele procura no diretório plugins subdiretórios que contenham um arquivo plugin.rb. O arquivo plugin.rb tem dois propósitos: é o manifesto do seu plugin com as informações necessárias sobre ele, incluindo: nome, informações de contato e uma descrição. O segundo propósito é inicializar qualquer código Ruby necessário para executar seu plugin.
No nosso caso, não vamos adicionar nenhum código Ruby, mas ainda precisamos do plugin.rb. Vamos criar o diretório basic-plugin com o arquivo plugin.rb dentro dele, com o seguinte conteúdo:
basic-plugin/plugin.rb
# name: basic-plugin
# about: Um plugin super simples para demonstrar como os plugins funcionam
# version: 0.0.1
# authors: Desenvolvedor Incrível de Plugins
# url: https://github.com/seuusuario/basic-plugin
Depois de criar este arquivo, você deve reiniciar seu servidor local e o plugin deve ser carregado.
Um problema importante!
Se você está acostumado com o desenvolvimento regular em Rails, pode notar que os plugins não são tão convenientes quando se trata de recarregamento. Em geral, ao fazer alterações no seu plugin, você deve Ctrl+c no servidor para interrompê-lo e, em seguida, executá-lo novamente usando bin/dev.
Minhas alterações não foram detectadas! 
Às vezes, o cache não é limpo completamente, especialmente quando você cria novos arquivos ou exclui arquivos antigos. Para contornar esse problema, remova sua pasta tmp e inicie o Rails novamente. Em um Mac, você pode fazer isso em um único comando: rm -rf tmp; bin/dev.
Verificando se seu plugin foi carregado
Depois de reiniciar seu servidor local, visite a URL /admin/plugins (certifique-se de estar logado como uma conta de administrador primeiro, pois apenas administradores podem ver o registro de plugins).
Se tudo funcionar corretamente, você verá seu plugin na lista:
Parabéns, você acabou de criar seu primeiro plugin!
Vamos adicionar algum JavaScript
No momento, seu plugin não faz nada. Vamos adicionar um arquivo JavaScript que exibirá uma caixa de alerta quando o Discourse carregar. Isso será extremamente irritante para qualquer usuário e não é recomendado como um plugin real, mas mostrará como inserir JavaScript em nossa aplicação em execução.
Crie o seguinte arquivo:
plugins/basic-plugin/assets/javascripts/discourse/initializers/alert.js
export default {
name: "alert",
initialize() {
alert("caixas de alerta são irritantes!");
},
};
Agora, se você reiniciar seu servidor local, deverá ver “caixas de alerta são irritantes!” aparecer na tela. (Se não aparecer, consulte o tópico “Minhas alterações não foram detectadas” acima).
Vamos analisar como isso funcionou:
-
Arquivos JavaScript colocados em
assets/javascripts/discourse/initializerssão executados automaticamente quando a aplicação Discourse é carregada. -
Este arquivo específico
exporta um objeto, que possui umnamee uma funçãoinitialize. -
O
nameprecisa ser único, então eu simplesmente o chamei dealert. -
A função
initialize()é chamada quando a aplicação é carregada. No nosso caso, tudo o que ela faz é executar nosso códigoalert().
Agora você é um desenvolvedor oficial de plugins do Discourse!
Mais na série
Parte 1: Este tópico
Parte 2: Plugin Outlets
Parte 3: Configurações do Site
Parte 4: Configuração do git
Parte 5: Interfaces de administração
Parte 6: Testes de aceitação
Parte 7: Publique seu plugin
Este documento está sob controle de versão — sugira alterações no GitHub.



