Práctica: Heroku plugin
Objetivo
El objetivo de esta práctica es extender el package NodeJS publicado en npm en una práctica anterior con un nuevo plugin
que permita realizar el despliegue en Heroku con un simple gulp deploy-heroku.
En esta práctica se pide desarrollar el plugin para Heroku
IDEA: En esta práctica los teams trabajaran en pares de teams A y B. Los del team A usarán el gitbook-start del team B y los del team B usarán el gitbook-start del team A.
Punto de partida
El paquete se construye a partir de la Práctica: Nueva funcionalidad para el Paquete NPM: plugins.
La opción --deploy
- Se trata de añadir al ejecutable
gitbook-startuna opción--deployo-dque va seguida de un tipo de despliegue:
Que indica que nuestro usuario quiere que se le provea de tareas$ gitbook-start --deploy ull-iaas-es --deploy herokugulpdenominadasdeploy-ull-iaas-esydeploy-herokuque despliegan el libro en los diferentes sites. Esto supone que existen módulos npm con nombresgitbook-start-plugin-iaas-ull-esygitbook-start-plugin-heroku
- Para implementar la ejecución de la llamada en línea de comandos:
Esto es, deberán existir plugins$ gitbook-start --deploy ull-iaas-es --deploy herokugitbook-start-plugin-iaas-ull-esygitbook-start-plugin-herokuque exportan un objeto que dispone de un métododeploy(), de manera que si desde un código principal se llama a un código como este:se despliega el libro en la máquina virtual devar iaas = require("book-start-plugin-iaas-ull-es"); var result = iaas.deploy();iaas.ull.es Observe que hay dos fases en este proceso:
- cuando se construye la estructura inicial por
gitbook-startla jerarquía de directorios conteniendo los scripts y ficheros markdown para el libro y - cuando el autor escribe y despliega el libro llamando a
gulp. Las llamadas agulp deploy-...ocurren en esta segunda fase. El despliegue hace unrequirede los plugins que implementan los despliegues solicitados.
- cuando se construye la estructura inicial por
Es conveniente que el método
deploy()proveído por el plugin retorne un objeto con atributos describiendo los resultados del despliegue como- Salida por
stdouten la máquina remota - Salida por
stderren la máquina remota - Códigos de error si los hubiera
- etc. Cualquier información adicional que considere conveniente.
- Salida por
El método
deploy()puede obtener información sobre el libro a partir delpackage.jsongenerado. También si lo prefieren pueden pasarle un argumento con la información/estado que hayamos podido recopilar sobre el objeto resultante delpackage.jsonLos plugins deben estar correctamente documentados.
- Por ejemplo, el plugin del
iaas-ull-esnecesita al menos saber la dirección de la máquina virtual y el camino en dicha máquina hasta el repositorio que contiene el libro - Pueden optar por aceptar argumentos adicionales en línea de comandos para esta información
$ gitbook-start -d iaas-ull-es, --iaas-IP 127.0.25.5 --iaas-path src/chuchu- O bien pueden optar porque simplemente el usuario añada los correspondientes campos en el
package.json
{ ... "iaas-IP", "127.0.25.5", "iaas-path", "src/chuchu", ... }En cualquier caso debe aparecer en la documentación lo que hay que hacer
- El método
initializedel objeto plugin.- Es conveniente que el objeto retornado por el
requiredel plugindisponga de un métodovar iaas = require("book-start-plugin-iaas-ull-es"); var result = iaas.initialize();initializeque es llamado porgitbook-starten el tiempo de construcción de la jerarquía del libro (Fase 1). Este método puede ser usado para cosas como: - En el caso del plugin
iaas- si se quiere, no se pide para esta práctica - para construir el repositorio en la máquina remota, o bien - tampoco se pide - para generar e instalar la clave y publicarla en la máquina virtual, etc. - En el caso del plugin
herokupara añadir un template con el servidor express que va a correr en la máquina de Heroku, etc. - También se puede usar
initializepara modificar elgulpfilea conveniencia, de manera que sea el propio plugin el que escriba la seccióndeploy-pluginy nogitbook-start
- Es conveniente que el objeto retornado por el
- Por ejemplo, el plugin del
- Code Smells
- Patrones de Diseño
- Principios de Diseño
- Creación de Paquetes y Módulos en NodeJS
- Gulp
- Para analizar los argumentos pasados en línea de comandos un buen módulo es minimist
- ejs para la creación de plantillas
- Paquetes - como
fs- para el manejo de archivos en Node.JS