Criar um plugin no Discourse pode ser realmente simples, depois que você aprende algumas peculiaridades. O objetivo deste post é criar um plugin modelo (skeleton) e apresentá-lo aos 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 adequado e volte aqui quando terminar.
plugin.rb
Use GitHub - discourse/discourse-plugin-skeleton: Template for Discourse plugins · GitHub para criar um plugin completo do Discourse com a estrutura básica no seu diretório
plugins
A estrutura básica agora está incluída no núcleo do Discourse.
rake plugin:create[nome-do-plugin]criará um plugin usando essa estrutura.
Quando o Discourse inicia, ele procura no diretório plugins por subdiretórios que contenham um arquivo plugin.rb. O arquivo plugin.rb tem duas finalidades: é o manifesto do seu plugin, com as informações obrigatórias sobre ele, incluindo nome, informações de contato e descrição. A segunda finalidade é inicializar qualquer código Ruby necessário para executar o plugin.
No nosso caso, não adicionaremos 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: Awesome Plugin Developer
# url: https://github.com/yourusername/basic-plugin
Depois de criar este arquivo, você deve reiniciar seu servidor local e o plugin deverá ser carregado.
Um detalhe importante!
Se você está acostumado com o desenvolvimento padrão do Rails, pode notar que os plugins não são tão práticos quando se trata de recarregamento. Em geral, quando você faz alterações no seu plugin, deve pressionar Ctrl+c para parar o servidor e, em seguida, executá-lo novamente usando bin/dev.
Minhas alterações não foram reconhecidas! 
À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. No Mac, você pode fazer isso com 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 funcionou corretamente, você deverá 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 for carregado. Isso será super 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 cabeçalho “Minhas alterações não foram reconhecidas” 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 um
name(nome) e uma funçãoinitialize(inicialização). -
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().
Você agora é 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 é controlado por versão - sugira alterações no github.

