Crear un plugin en Discourse puede ser realmente sencillo, una vez que aprendes algunos peculiaridades. El objetivo de este post es crear un esqueleto de plugin y presentarte lo básico.
Tu entorno de desarrollo
Asegúrate de tener un entorno de desarrollo de Discourse ejecutándose en tu computadora. Recomiendo que uses la guía de configuración adecuada y vuelvas cuando hayas terminado.
plugin.rb
Usa GitHub - discourse/discourse-plugin-skeleton: Template for Discourse plugins · GitHub para crear un esqueleto completo de plugin de Discourse en tu directorio de plugins
El esqueleto ahora viene incluido en el núcleo de Discourse;
rake plugin:create[plugin-name]creará un plugin usando el esqueleto.
Cuando Discourse se inicia, busca en el directorio plugins subdirectorios que contengan un archivo plugin.rb. El archivo plugin.rb tiene dos propósitos: es el manifiesto de tu plugin con la información requerida sobre tu plugin, incluyendo: su nombre, información de contacto y una descripción. El segundo propósito es inicializar cualquier código Ruby necesario para ejecutar tu plugin.
En nuestro caso, no añadiremos ningún código Ruby, pero aún necesitamos el plugin.rb. Creemos el directorio basic-plugin con el archivo plugin.rb dentro, con el siguiente contenido:
basic-plugin/plugin.rb
# name: basic-plugin
# about: Un plugin súper simple para demostrar cómo funcionan los plugins
# version: 0.0.1
# authors: Desarrollador de plugins increíble
# url: https://github.com/yourusername/basic-plugin
Una vez que hayas creado este archivo, debes reiniciar tu servidor local y el plugin debería cargarse.
¡Una advertencia importante!
Si estás acostumbrado al desarrollo habitual de Rails, quizás notes que los plugins no son tan cómodos cuando se trata de recargar. En general, cuando hagas cambios en tu plugin, deberías presionar Ctrl+c en el servidor para detenerlo y luego ejecutarlo nuevamente usando bin/dev.
¡Mis cambios no se detectaron! 
A veces la caché no se limpia completamente, especialmente cuando creas nuevos archivos o borras archivos antiguos. Para solucionar este problema, elimina tu carpeta tmp y vuelve a iniciar Rails. En una Mac puedes hacerlo con un solo comando: rm -rf tmp; bin/dev.
Verificar que tu plugin se cargó
Una vez que hayas reiniciado tu servidor local, visita la URL /admin/plugins (asegúrate de haber iniciado sesión con una cuenta de administrador primero, ya que solo los administradores pueden ver el registro de plugins).
Si todo funcionó correctamente, deberías ver tu plugin en la lista:
¡Felicidades, acabas de crear tu primer plugin!
Agreguemos algo de JavaScript
Por ahora, tu plugin no hace nada. Agreguemos un archivo JavaScript que muestre una alerta cuando Discourse se cargue. Esto será muy molesto para cualquier usuario y no se recomienda como un plugin real, pero mostrará cómo insertar JavaScript en nuestra aplicación en ejecución.
Crea el siguiente archivo:
plugins/basic-plugin/assets/javascripts/discourse/initializers/alert.js
export default {
name: "alert",
initialize() {
alert("¡Las cajas de alerta son molestas!");
},
};
Ahora, si reinicias tu servidor local, deberías ver «¡Las cajas de alerta son molestas!» aparecer en la pantalla. (Si no fue así, consulta el encabezado «Mis cambios no se detectaron» más arriba).
Repasemos cómo funcionó esto:
-
Los archivos JavaScript colocados en
assets/javascripts/discourse/initializersse ejecutan automáticamente cuando la aplicación de Discourse se carga. -
Este archivo en particular
exportaun objeto, que tiene unnamey una funcióninitialize. -
El
namedebe ser único, así que simplemente lo llaméalert. -
La función
initialize()se llama cuando la aplicación se carga. En nuestro caso, todo lo que hace es ejecutar nuestro códigoalert().
¡Ahora eres un desarrollador oficial de plugins de Discourse!
Más en la serie
Parte 1: Este tema
Parte 2: Salidas de plugins
Parte 3: Configuraciones del sitio
Parte 4: Configuración de git
Parte 5: Interfaces de administración
Parte 6: Pruebas de aceptación
Parte 7: Publica tu plugin
Este documento tiene control de versiones: sugiere cambios en GitHub.



