SlideShare una empresa de Scribd logo
1 de 22
Descargar para leer sin conexión
Automatización de tareas con
Álvaro Navarro
26/02/2016
1
Índice
1. Introducción
2. Gulp vs Grunt
3. Gulp API
4. Estructura de un gulpfile
5. Plugins
6. Otras herramientas
7. Referencias
2
1. Introducción
● Auge de nuevos frameworks javascript (AngularJs, Backbone,
Ember.js, etc.)
○ Para el desarrollo de aplicaciones sobre Node.js
○ Se requieren herramientas para gestionar los proyectos
● Las arquitecturas basadas en estos frameworks necesitan un build
system
● Un build system es una colección de tareas que automatizan un
trabajo repetitivo
○ Análogo a Maven en Java
● Los componentes más comunes en un flujo típico de front-end son:
○ Gestores de dependencias
○ Preprocesadores (opcionalmente)
○ Herramientas para la construcción de tareas
● Gulp es una herramienta para la gestión y automatización de tareas
● El único requisito para utilizar Gulp es tener instalado Node.js
3
1. Introducción
● Estas herramientas standard construyen estructuras y tareas comunes para todos los desarrolladores
● El uso típico incluiría:
○ Compilación de CSS y JavaScript preprocesado
○ Concatenación
○ Minificación
○ Lanzar un servidor para la recarga automática en el browser
○ Creación de una build para despliegue
4
2. Grunt vs Gulp
● Ambas son task runners: herramientas
para definir y ejecutar tareas
● Estas tareas permiten automatizar la
gestión del proyecto
● Grunt (2012) salió primero y Gulp (2014)
después ofreciendo varias mejoras
● Tienen un enfoque distinto
○ Grunt se centra en la configuración
○ Gulp se centra en el código
● Internamente están implementados con
conceptos distintos
○ Grunt almacena en ficheros temporales
○ Gulp utiliza streaming en memoria
5
6
2. Grunt vs Gulp
● Grunt realiza lectura y escritura en ficheros durante el proceso
7
● Gulp usa streams, leyendo y escribiendo en memoria
2. Grunt vs Gulp
8
● Un stream es un flujo de datos para el
intercambio de información
● Gulp utiliza el módulo Stream de Node.js
○ Usa el paquete vinyl-fs para leer y escribir
Streams
● Las tuberías (pipes) son un mecanismo para
la comunicación y sincronización entre
procesos
○ Basados en el patrón productor/consumidor
○ Están implementadas de forma muy eficiente
en los sistemas operativos
○ Inician todos los procesos al mismo tiempo
○ Atienden automáticamente los
requerimientos de lectura de datos para
cada proceso cuando los datos son escritos
por el proceso anterior
2. Grunt vs Gulp
Grunt - Configuración sobre código Gulp - Código sobre configuración
9
Ej: Tarea wiredep
2. Grunt vs Gulp
10
GRUNT GULP
Enfoque Configuración sobre código Código sobre configuración
Rendimiento Basado en ficheros Basado en streaming
Sintaxis Más verboso Más conciso y claro
Documentación Gran comunidad de usuarios y
documentación
Algo menor, aunque
igualmente gran popularidad
Plugins ~5.525 plugins ~2166 plugins
1. gulp.task
○ Define una tarea
2. gulp.src
○ Lee ficheros
3. gulp.dest
○ Escribe los ficheros
4. gulp.watch
○ Observa si hay cambios en los ficheros
11
3. Gulp API
3. Gulp API
1. gulp.task()
● Define una tarea
● Tiene 3 argumentos:
○ el nombre de la tarea
○ dependencias de otras tareas
○ la función a ejecutar
2. gulp.src()
● Toma como parámetro una cadena que coincida con uno o más archivos
● Utiliza patrones que usa el intérprete de comandos de unix(shell)
● Retorna un stream que puede ser “pipeado” a un plugin adicional ó hacia el método gulp.dest()
3. gulp.dest()
● Canaliza y escribe archivos desde un Stream
○ Puede canalizar a varias carpetas
○ Creará las carpetas que no existan
○ Retornará el Stream, por si deseamos realizar alguna acción más
● Sirve para escribir los datos actuales de un Stream
12
3. Gulp API
4. gulp.watch()
● Observa archivos y realiza una acción cuando se modifica un archivo
● Esto siempre devuelve un EventEmitter que emite los eventos de cambio
● Tiene 2 formas de uso:
○ gulp.watch(glob, [tasks])
○ gulp.watch(glob, callback)
● El primer parámetro es un glob con la ruta o un patrón con uno o varios ficheros
● El segundo puede ser una lista de tareas o una función a ejecutar
13
14
4. Estructura de un gulpfile
● El gulpfile debe de estar en la raíz del proyecto
● La estructura debe contener:
○ La importación de otros módulos
○ La importación de un fichero de
configuración del proyecto (opcional)
○ La definición de las tareas
○ Observadores que se ejecutan en función
de ciertos cambios (opcional)
○ Una tarea por defecto a ejecutar
● Si el gulpfile del proyecto conviene
modularizarlo en ficheros con subtareas
● En una arquitectura conviene externalizar las
tareas comunes en un módulo de Node.js
15
5. Plugins
● Gulp tiene alrededor de ~2166 plugins
“oficiales” y otros no-oficiales
● Se pueden encontrar en
○ http://gulpjs.com/plugins/
○ https://www.npmjs.com/
● Los plugins disponibles permiten realizar
tareas muy versátiles
○ Concatenar ficheros
○ Minimizar js
○ Minimizar imágenes
○ Inyectar dependencias dinámicamente
○ Ejecutar tests
○ Gestionar el código en un repositorio (svn,
git)
○ Empaquetar un directorio
○ Ejecutar jshint, htmlhint
○ Generar css ejecutando saas, less, etc.
○ Mostrar ayuda
16
5. Plugins
● gulp-concat
○ Para juntar varios archivos en uno mismo.
○ Menos peticiones al servidor
17
● gulp-uglify
○ Sirve para minificar archivos js
○ Código se interpreta antes
○ Permite ejecutar una tarea de manera condicional
var concat = require('gulp-concat');
gulp.task('scripts', function() {
return gulp.src('./lib/*.js')
.pipe(concat('all.js'))
.pipe(gulp.dest('./dist/'));
});
var uglify = require('gulp-uglify');
gulp.task('compress', function() {
return gulp.src('lib/*.js')
.pipe(uglify())
.pipe(gulp.dest('dist'));
});
5. Plugins
● gulp-zip
○ Para comprimir directorios con ficheros
○ Permite generar una distribución front-end
18
● gulp-if
○ Permite ejecutar una tarea de manera
condicional
const gulp = require('gulp');
const zip = require('gulp-zip');
gulp.task('default', () => {
return gulp.src('src/*')
.pipe(zip('archive.zip'))
.pipe(gulp.dest('dist'));
});
var gulpif = require('gulp-if');
var uglify = require('gulp-uglify');
var condition = true; // TODO: add business logic
gulp.task('task', function() {
gulp.src('./src/*.js')
.pipe(gulpif(condition, uglify()))
.pipe(gulp.dest('./dist/'));
});
5. Plugins
19
● gulp con karma
○ Podemos crear tareas utilizando librerías de
nodejs que no son plugins de gulp
● gulp-git
○ Para ejecutar comandos sobre un
repositorio de código GIT
○ Commit, add, push, clone, etc
var gulp = require('gulp');
var git = require('gulp-git');
// Run git commit without checking for a
// message using raw arguments
gulp.task('commit', function(){
return gulp.src('./git-test/*')
.pipe(git.commit(undefined, {
args: '-m "initial commit"',
disableMessageRequirement: true
}));
});
// Run git push
gulp.task('push', function(){
git.push('origin', 'master', function (err) {
if (err) throw err;
});
});
var gulp = require('gulp');
var Server = require('karma').Server;
/**
* Run test once and exit
*/
gulp.task('test', function (done) {
new Server({
configFile: __dirname + '/karma.conf.js',
singleRun: true
}, done).start();
});
6. Otras herramientas
● Mimosa (2014)
● Broccoli (2014)
● Gruntjs (2012)
● Brunch (2011)
● Jake (2010)
20
7. Referencias
● http://joellongie.com/gulp-build-system-
fundamentals/
● https://medium.com/@preslavrachev/gulp-
vs-grunt-why-one-why-the-other-
f5d3b398edc4#.7zm1ho8ae
● https://habrahabr.
ru/company/yandex/blog/239993/
● http://gruntjs.com/getting-started
● http://frontendlabs.io/1669--gulp-js-en-
espanol-tutorial-basico-primeros-pasos-y-
ejemplos
● http://www.codeproject.
com/Articles/1064203/Introduction-Style-
Guidelines-and-Automation-Featu
● https://es.wikipedia.org/wiki/Tuber%C3%
ADa_(inform%C3%A1tica)
● https://www.npmjs.com
● http://nightdeveloper.net/plugins-utiles-gulp/
● https://osiux.ws/2014/12/utiles-plugins-para-
gulp/
21
22

Más contenido relacionado

La actualidad más candente

Drupal Cron
Drupal CronDrupal Cron
Drupal Cronrcechang
 
Docker y Kubernetes, en busca de la alta disponibilidad
Docker y Kubernetes, en busca de la alta disponibilidadDocker y Kubernetes, en busca de la alta disponibilidad
Docker y Kubernetes, en busca de la alta disponibilidadÓscar De Arriba González
 
Meetup de kubernetes, conceptos básicos.
Meetup  de kubernetes, conceptos básicos.Meetup  de kubernetes, conceptos básicos.
Meetup de kubernetes, conceptos básicos.Paradigma Digital
 
Presentación Docker
Presentación DockerPresentación Docker
Presentación DockerITPAMI
 
BEEVA | Introducción a Docker
BEEVA | Introducción a DockerBEEVA | Introducción a Docker
BEEVA | Introducción a DockerBEEVA_es
 
Testeando aplicaciones Kubernetes: escalabilidad y tolerancia a fallos
Testeando aplicaciones Kubernetes: escalabilidad y tolerancia a fallosTesteando aplicaciones Kubernetes: escalabilidad y tolerancia a fallos
Testeando aplicaciones Kubernetes: escalabilidad y tolerancia a fallosMicael Gallego
 
Manejo de packages en Kubernetes con Helm
Manejo de packages en Kubernetes con HelmManejo de packages en Kubernetes con Helm
Manejo de packages en Kubernetes con HelmMario IC
 
Cloud Native Mexico - Introducción a Kubernetes
Cloud Native Mexico - Introducción a KubernetesCloud Native Mexico - Introducción a Kubernetes
Cloud Native Mexico - Introducción a KubernetesDomingo Suarez Torres
 
Kubernetes - #dockerconlima
Kubernetes  - #dockerconlimaKubernetes  - #dockerconlima
Kubernetes - #dockerconlimaAngel Nuñez
 
Terraspace, the definitive terraform framework
Terraspace, the definitive terraform frameworkTerraspace, the definitive terraform framework
Terraspace, the definitive terraform frameworkMario IC
 
Sandbox para ejercicios de programación
Sandbox para ejercicios de programaciónSandbox para ejercicios de programación
Sandbox para ejercicios de programaciónMario Garcia-Valdez
 

La actualidad más candente (20)

Drupal Cron
Drupal CronDrupal Cron
Drupal Cron
 
Fury - Docker Meetup
Fury - Docker MeetupFury - Docker Meetup
Fury - Docker Meetup
 
Introducción a Kubernetes
Introducción a KubernetesIntroducción a Kubernetes
Introducción a Kubernetes
 
Git windows
Git windowsGit windows
Git windows
 
Presentación Docker
Presentación DockerPresentación Docker
Presentación Docker
 
Docker y Kubernetes, en busca de la alta disponibilidad
Docker y Kubernetes, en busca de la alta disponibilidadDocker y Kubernetes, en busca de la alta disponibilidad
Docker y Kubernetes, en busca de la alta disponibilidad
 
Usando docker
Usando dockerUsando docker
Usando docker
 
Concurrencia en Java
Concurrencia en Java Concurrencia en Java
Concurrencia en Java
 
Meetup de kubernetes, conceptos básicos.
Meetup  de kubernetes, conceptos básicos.Meetup  de kubernetes, conceptos básicos.
Meetup de kubernetes, conceptos básicos.
 
Presentación Docker
Presentación DockerPresentación Docker
Presentación Docker
 
Docker 2014 v2
Docker 2014 v2Docker 2014 v2
Docker 2014 v2
 
BEEVA | Introducción a Docker
BEEVA | Introducción a DockerBEEVA | Introducción a Docker
BEEVA | Introducción a Docker
 
Testeando aplicaciones Kubernetes: escalabilidad y tolerancia a fallos
Testeando aplicaciones Kubernetes: escalabilidad y tolerancia a fallosTesteando aplicaciones Kubernetes: escalabilidad y tolerancia a fallos
Testeando aplicaciones Kubernetes: escalabilidad y tolerancia a fallos
 
Manejo de packages en Kubernetes con Helm
Manejo de packages en Kubernetes con HelmManejo de packages en Kubernetes con Helm
Manejo de packages en Kubernetes con Helm
 
Docker y PostgreSQL
Docker y PostgreSQLDocker y PostgreSQL
Docker y PostgreSQL
 
Git Primeros pasos
Git Primeros pasosGit Primeros pasos
Git Primeros pasos
 
Cloud Native Mexico - Introducción a Kubernetes
Cloud Native Mexico - Introducción a KubernetesCloud Native Mexico - Introducción a Kubernetes
Cloud Native Mexico - Introducción a Kubernetes
 
Kubernetes - #dockerconlima
Kubernetes  - #dockerconlimaKubernetes  - #dockerconlima
Kubernetes - #dockerconlima
 
Terraspace, the definitive terraform framework
Terraspace, the definitive terraform frameworkTerraspace, the definitive terraform framework
Terraspace, the definitive terraform framework
 
Sandbox para ejercicios de programación
Sandbox para ejercicios de programaciónSandbox para ejercicios de programación
Sandbox para ejercicios de programación
 

Destacado

Flujos de trabajo para la web moderna
Flujos de trabajo para la web modernaFlujos de trabajo para la web moderna
Flujos de trabajo para la web modernaMarcos Gonzalez
 
Flujos de trabajo para un desarrollador web frontend
Flujos de trabajo para un desarrollador web frontendFlujos de trabajo para un desarrollador web frontend
Flujos de trabajo para un desarrollador web frontendLeonidas Esteban González
 
Herramientas Frontend - Betabeers Salamanca - Enero 2015
Herramientas Frontend - Betabeers Salamanca - Enero 2015Herramientas Frontend - Betabeers Salamanca - Enero 2015
Herramientas Frontend - Betabeers Salamanca - Enero 2015Jesus Merino Parra
 
Front-end: Diseñar webs rápidas, flexibles y potentes
Front-end: Diseñar webs rápidas, flexibles y potentesFront-end: Diseñar webs rápidas, flexibles y potentes
Front-end: Diseñar webs rápidas, flexibles y potentesRomán Hernández
 
Chicisimo App Móvil
Chicisimo App MóvilChicisimo App Móvil
Chicisimo App MóvilGertrumm
 
Introduction to Gulp
Introduction to GulpIntroduction to Gulp
Introduction to Gulpapdhtg6
 
Scio Talks - Gobierna el Frontend 1er parte
Scio Talks - Gobierna el Frontend 1er parteScio Talks - Gobierna el Frontend 1er parte
Scio Talks - Gobierna el Frontend 1er parteScio Consulting
 
REST, jQuery y otros Frameworks JS
REST, jQuery y otros Frameworks JSREST, jQuery y otros Frameworks JS
REST, jQuery y otros Frameworks JSAdolfo Sanz De Diego
 
Desarrollo de Mobile Web Apps
Desarrollo de Mobile Web AppsDesarrollo de Mobile Web Apps
Desarrollo de Mobile Web AppsAsier Marqués
 
Integración de WAI-ARIA en HTML5
Integración de WAI-ARIA en HTML5Integración de WAI-ARIA en HTML5
Integración de WAI-ARIA en HTML5Jose R. Hilera
 
Workflow para volar con el CSS
Workflow para volar con el CSSWorkflow para volar con el CSS
Workflow para volar con el CSSNaiara Abaroa
 
Mejora tus US con UX y modelos de satisfacción
Mejora tus US con UX y modelos de satisfacciónMejora tus US con UX y modelos de satisfacción
Mejora tus US con UX y modelos de satisfaccióndnmoncada
 
Ejemplo de corrección de errores de accesibilidad WCAG 2.0 en una página web
Ejemplo de corrección de errores de accesibilidad WCAG 2.0 en una página webEjemplo de corrección de errores de accesibilidad WCAG 2.0 en una página web
Ejemplo de corrección de errores de accesibilidad WCAG 2.0 en una página webJose R. Hilera
 
Accesibilidad, hojas estilo cascada, y tu
Accesibilidad, hojas estilo cascada, y tuAccesibilidad, hojas estilo cascada, y tu
Accesibilidad, hojas estilo cascada, y tuAdrian Moreno Garcia
 

Destacado (20)

Flujos de trabajo para la web moderna
Flujos de trabajo para la web modernaFlujos de trabajo para la web moderna
Flujos de trabajo para la web moderna
 
Flujos de trabajo para un desarrollador web frontend
Flujos de trabajo para un desarrollador web frontendFlujos de trabajo para un desarrollador web frontend
Flujos de trabajo para un desarrollador web frontend
 
Herramientas Frontend - Betabeers Salamanca - Enero 2015
Herramientas Frontend - Betabeers Salamanca - Enero 2015Herramientas Frontend - Betabeers Salamanca - Enero 2015
Herramientas Frontend - Betabeers Salamanca - Enero 2015
 
Front-end: Diseñar webs rápidas, flexibles y potentes
Front-end: Diseñar webs rápidas, flexibles y potentesFront-end: Diseñar webs rápidas, flexibles y potentes
Front-end: Diseñar webs rápidas, flexibles y potentes
 
Las Herramientas de un Frontend
Las Herramientas de un FrontendLas Herramientas de un Frontend
Las Herramientas de un Frontend
 
Chicisimo App Móvil
Chicisimo App MóvilChicisimo App Móvil
Chicisimo App Móvil
 
gulp-techdencias
gulp-techdenciasgulp-techdencias
gulp-techdencias
 
Gulp: Task Runner
Gulp: Task RunnerGulp: Task Runner
Gulp: Task Runner
 
Chicisimo
ChicisimoChicisimo
Chicisimo
 
Introduction to Gulp
Introduction to GulpIntroduction to Gulp
Introduction to Gulp
 
Scio Talks - Gobierna el Frontend 1er parte
Scio Talks - Gobierna el Frontend 1er parteScio Talks - Gobierna el Frontend 1er parte
Scio Talks - Gobierna el Frontend 1er parte
 
Desarrollo de webapps 1
Desarrollo de webapps 1Desarrollo de webapps 1
Desarrollo de webapps 1
 
REST, jQuery y otros Frameworks JS
REST, jQuery y otros Frameworks JSREST, jQuery y otros Frameworks JS
REST, jQuery y otros Frameworks JS
 
Desarrollo de Mobile Web Apps
Desarrollo de Mobile Web AppsDesarrollo de Mobile Web Apps
Desarrollo de Mobile Web Apps
 
Tools and Frameworks
Tools and FrameworksTools and Frameworks
Tools and Frameworks
 
Integración de WAI-ARIA en HTML5
Integración de WAI-ARIA en HTML5Integración de WAI-ARIA en HTML5
Integración de WAI-ARIA en HTML5
 
Workflow para volar con el CSS
Workflow para volar con el CSSWorkflow para volar con el CSS
Workflow para volar con el CSS
 
Mejora tus US con UX y modelos de satisfacción
Mejora tus US con UX y modelos de satisfacciónMejora tus US con UX y modelos de satisfacción
Mejora tus US con UX y modelos de satisfacción
 
Ejemplo de corrección de errores de accesibilidad WCAG 2.0 en una página web
Ejemplo de corrección de errores de accesibilidad WCAG 2.0 en una página webEjemplo de corrección de errores de accesibilidad WCAG 2.0 en una página web
Ejemplo de corrección de errores de accesibilidad WCAG 2.0 en una página web
 
Accesibilidad, hojas estilo cascada, y tu
Accesibilidad, hojas estilo cascada, y tuAccesibilidad, hojas estilo cascada, y tu
Accesibilidad, hojas estilo cascada, y tu
 

Similar a Automatización de tareas con Gulp

Servidor de mapas en HA con Jboss, Geoserver y PostGIS.
Servidor de mapas en HA con Jboss, Geoserver y PostGIS.Servidor de mapas en HA con Jboss, Geoserver y PostGIS.
Servidor de mapas en HA con Jboss, Geoserver y PostGIS.David Tabernero Pérez
 
Gulp js php sevilla 28 septiembre 2016
Gulp js   php sevilla 28 septiembre 2016Gulp js   php sevilla 28 septiembre 2016
Gulp js php sevilla 28 septiembre 2016Agencia INNN
 
Servidores de mapas en alta disponibilidad
Servidores de mapas en alta disponibilidadServidores de mapas en alta disponibilidad
Servidores de mapas en alta disponibilidadInclamSoft
 
Frontend Tools | Herramientas para Frontends
Frontend Tools | Herramientas para FrontendsFrontend Tools | Herramientas para Frontends
Frontend Tools | Herramientas para FrontendsDavid Ballén
 
Curso: Publicando mi proyecto web en Github
Curso: Publicando mi proyecto web en GithubCurso: Publicando mi proyecto web en Github
Curso: Publicando mi proyecto web en GithubCarlos Huamaní
 
Entonamiento y perfilado de Drupal
Entonamiento y perfilado de DrupalEntonamiento y perfilado de Drupal
Entonamiento y perfilado de Drupalcamposer
 
Git para-principiantes
Git para-principiantesGit para-principiantes
Git para-principiantesnscoder_mad
 
Presentacion #2 github Aplicaciones Seguras
Presentacion #2 github Aplicaciones SegurasPresentacion #2 github Aplicaciones Seguras
Presentacion #2 github Aplicaciones SegurasJosé Moreno
 

Similar a Automatización de tareas con Gulp (20)

Servidor de mapas en HA con Jboss, Geoserver y PostGIS.
Servidor de mapas en HA con Jboss, Geoserver y PostGIS.Servidor de mapas en HA con Jboss, Geoserver y PostGIS.
Servidor de mapas en HA con Jboss, Geoserver y PostGIS.
 
Gulp js php sevilla 28 septiembre 2016
Gulp js   php sevilla 28 septiembre 2016Gulp js   php sevilla 28 septiembre 2016
Gulp js php sevilla 28 septiembre 2016
 
Servidores de mapas en alta disponibilidad
Servidores de mapas en alta disponibilidadServidores de mapas en alta disponibilidad
Servidores de mapas en alta disponibilidad
 
Frontend Tools | Herramientas para Frontends
Frontend Tools | Herramientas para FrontendsFrontend Tools | Herramientas para Frontends
Frontend Tools | Herramientas para Frontends
 
Kubernetes workshop
Kubernetes workshopKubernetes workshop
Kubernetes workshop
 
Paralela10
Paralela10Paralela10
Paralela10
 
202204-Modernizando aplicaciones legacy
202204-Modernizando aplicaciones legacy202204-Modernizando aplicaciones legacy
202204-Modernizando aplicaciones legacy
 
Redes
RedesRedes
Redes
 
Paralela9
Paralela9Paralela9
Paralela9
 
ATICA DevOps
ATICA DevOpsATICA DevOps
ATICA DevOps
 
Hadoop en accion
Hadoop en accionHadoop en accion
Hadoop en accion
 
Hilo de ejecución
Hilo de ejecuciónHilo de ejecución
Hilo de ejecución
 
Logs en Linux.pdf
Logs en Linux.pdfLogs en Linux.pdf
Logs en Linux.pdf
 
Curso: Publicando mi proyecto web en Github
Curso: Publicando mi proyecto web en GithubCurso: Publicando mi proyecto web en Github
Curso: Publicando mi proyecto web en Github
 
Entonamiento y perfilado de Drupal
Entonamiento y perfilado de DrupalEntonamiento y perfilado de Drupal
Entonamiento y perfilado de Drupal
 
Git para-principiantes
Git para-principiantesGit para-principiantes
Git para-principiantes
 
Migrando data - DRUPAL
Migrando data - DRUPALMigrando data - DRUPAL
Migrando data - DRUPAL
 
Presentacion #2 github Aplicaciones Seguras
Presentacion #2 github Aplicaciones SegurasPresentacion #2 github Aplicaciones Seguras
Presentacion #2 github Aplicaciones Seguras
 
Hadoop en accion
Hadoop en accionHadoop en accion
Hadoop en accion
 
Semana 2 Configuración entorno de desarrollo
Semana 2   Configuración entorno de desarrolloSemana 2   Configuración entorno de desarrollo
Semana 2 Configuración entorno de desarrollo
 

Automatización de tareas con Gulp

  • 1. Automatización de tareas con Álvaro Navarro 26/02/2016 1
  • 2. Índice 1. Introducción 2. Gulp vs Grunt 3. Gulp API 4. Estructura de un gulpfile 5. Plugins 6. Otras herramientas 7. Referencias 2
  • 3. 1. Introducción ● Auge de nuevos frameworks javascript (AngularJs, Backbone, Ember.js, etc.) ○ Para el desarrollo de aplicaciones sobre Node.js ○ Se requieren herramientas para gestionar los proyectos ● Las arquitecturas basadas en estos frameworks necesitan un build system ● Un build system es una colección de tareas que automatizan un trabajo repetitivo ○ Análogo a Maven en Java ● Los componentes más comunes en un flujo típico de front-end son: ○ Gestores de dependencias ○ Preprocesadores (opcionalmente) ○ Herramientas para la construcción de tareas ● Gulp es una herramienta para la gestión y automatización de tareas ● El único requisito para utilizar Gulp es tener instalado Node.js 3
  • 4. 1. Introducción ● Estas herramientas standard construyen estructuras y tareas comunes para todos los desarrolladores ● El uso típico incluiría: ○ Compilación de CSS y JavaScript preprocesado ○ Concatenación ○ Minificación ○ Lanzar un servidor para la recarga automática en el browser ○ Creación de una build para despliegue 4
  • 5. 2. Grunt vs Gulp ● Ambas son task runners: herramientas para definir y ejecutar tareas ● Estas tareas permiten automatizar la gestión del proyecto ● Grunt (2012) salió primero y Gulp (2014) después ofreciendo varias mejoras ● Tienen un enfoque distinto ○ Grunt se centra en la configuración ○ Gulp se centra en el código ● Internamente están implementados con conceptos distintos ○ Grunt almacena en ficheros temporales ○ Gulp utiliza streaming en memoria 5
  • 6. 6
  • 7. 2. Grunt vs Gulp ● Grunt realiza lectura y escritura en ficheros durante el proceso 7 ● Gulp usa streams, leyendo y escribiendo en memoria
  • 8. 2. Grunt vs Gulp 8 ● Un stream es un flujo de datos para el intercambio de información ● Gulp utiliza el módulo Stream de Node.js ○ Usa el paquete vinyl-fs para leer y escribir Streams ● Las tuberías (pipes) son un mecanismo para la comunicación y sincronización entre procesos ○ Basados en el patrón productor/consumidor ○ Están implementadas de forma muy eficiente en los sistemas operativos ○ Inician todos los procesos al mismo tiempo ○ Atienden automáticamente los requerimientos de lectura de datos para cada proceso cuando los datos son escritos por el proceso anterior
  • 9. 2. Grunt vs Gulp Grunt - Configuración sobre código Gulp - Código sobre configuración 9 Ej: Tarea wiredep
  • 10. 2. Grunt vs Gulp 10 GRUNT GULP Enfoque Configuración sobre código Código sobre configuración Rendimiento Basado en ficheros Basado en streaming Sintaxis Más verboso Más conciso y claro Documentación Gran comunidad de usuarios y documentación Algo menor, aunque igualmente gran popularidad Plugins ~5.525 plugins ~2166 plugins
  • 11. 1. gulp.task ○ Define una tarea 2. gulp.src ○ Lee ficheros 3. gulp.dest ○ Escribe los ficheros 4. gulp.watch ○ Observa si hay cambios en los ficheros 11 3. Gulp API
  • 12. 3. Gulp API 1. gulp.task() ● Define una tarea ● Tiene 3 argumentos: ○ el nombre de la tarea ○ dependencias de otras tareas ○ la función a ejecutar 2. gulp.src() ● Toma como parámetro una cadena que coincida con uno o más archivos ● Utiliza patrones que usa el intérprete de comandos de unix(shell) ● Retorna un stream que puede ser “pipeado” a un plugin adicional ó hacia el método gulp.dest() 3. gulp.dest() ● Canaliza y escribe archivos desde un Stream ○ Puede canalizar a varias carpetas ○ Creará las carpetas que no existan ○ Retornará el Stream, por si deseamos realizar alguna acción más ● Sirve para escribir los datos actuales de un Stream 12
  • 13. 3. Gulp API 4. gulp.watch() ● Observa archivos y realiza una acción cuando se modifica un archivo ● Esto siempre devuelve un EventEmitter que emite los eventos de cambio ● Tiene 2 formas de uso: ○ gulp.watch(glob, [tasks]) ○ gulp.watch(glob, callback) ● El primer parámetro es un glob con la ruta o un patrón con uno o varios ficheros ● El segundo puede ser una lista de tareas o una función a ejecutar 13
  • 14. 14
  • 15. 4. Estructura de un gulpfile ● El gulpfile debe de estar en la raíz del proyecto ● La estructura debe contener: ○ La importación de otros módulos ○ La importación de un fichero de configuración del proyecto (opcional) ○ La definición de las tareas ○ Observadores que se ejecutan en función de ciertos cambios (opcional) ○ Una tarea por defecto a ejecutar ● Si el gulpfile del proyecto conviene modularizarlo en ficheros con subtareas ● En una arquitectura conviene externalizar las tareas comunes en un módulo de Node.js 15
  • 16. 5. Plugins ● Gulp tiene alrededor de ~2166 plugins “oficiales” y otros no-oficiales ● Se pueden encontrar en ○ http://gulpjs.com/plugins/ ○ https://www.npmjs.com/ ● Los plugins disponibles permiten realizar tareas muy versátiles ○ Concatenar ficheros ○ Minimizar js ○ Minimizar imágenes ○ Inyectar dependencias dinámicamente ○ Ejecutar tests ○ Gestionar el código en un repositorio (svn, git) ○ Empaquetar un directorio ○ Ejecutar jshint, htmlhint ○ Generar css ejecutando saas, less, etc. ○ Mostrar ayuda 16
  • 17. 5. Plugins ● gulp-concat ○ Para juntar varios archivos en uno mismo. ○ Menos peticiones al servidor 17 ● gulp-uglify ○ Sirve para minificar archivos js ○ Código se interpreta antes ○ Permite ejecutar una tarea de manera condicional var concat = require('gulp-concat'); gulp.task('scripts', function() { return gulp.src('./lib/*.js') .pipe(concat('all.js')) .pipe(gulp.dest('./dist/')); }); var uglify = require('gulp-uglify'); gulp.task('compress', function() { return gulp.src('lib/*.js') .pipe(uglify()) .pipe(gulp.dest('dist')); });
  • 18. 5. Plugins ● gulp-zip ○ Para comprimir directorios con ficheros ○ Permite generar una distribución front-end 18 ● gulp-if ○ Permite ejecutar una tarea de manera condicional const gulp = require('gulp'); const zip = require('gulp-zip'); gulp.task('default', () => { return gulp.src('src/*') .pipe(zip('archive.zip')) .pipe(gulp.dest('dist')); }); var gulpif = require('gulp-if'); var uglify = require('gulp-uglify'); var condition = true; // TODO: add business logic gulp.task('task', function() { gulp.src('./src/*.js') .pipe(gulpif(condition, uglify())) .pipe(gulp.dest('./dist/')); });
  • 19. 5. Plugins 19 ● gulp con karma ○ Podemos crear tareas utilizando librerías de nodejs que no son plugins de gulp ● gulp-git ○ Para ejecutar comandos sobre un repositorio de código GIT ○ Commit, add, push, clone, etc var gulp = require('gulp'); var git = require('gulp-git'); // Run git commit without checking for a // message using raw arguments gulp.task('commit', function(){ return gulp.src('./git-test/*') .pipe(git.commit(undefined, { args: '-m "initial commit"', disableMessageRequirement: true })); }); // Run git push gulp.task('push', function(){ git.push('origin', 'master', function (err) { if (err) throw err; }); }); var gulp = require('gulp'); var Server = require('karma').Server; /** * Run test once and exit */ gulp.task('test', function (done) { new Server({ configFile: __dirname + '/karma.conf.js', singleRun: true }, done).start(); });
  • 20. 6. Otras herramientas ● Mimosa (2014) ● Broccoli (2014) ● Gruntjs (2012) ● Brunch (2011) ● Jake (2010) 20
  • 21. 7. Referencias ● http://joellongie.com/gulp-build-system- fundamentals/ ● https://medium.com/@preslavrachev/gulp- vs-grunt-why-one-why-the-other- f5d3b398edc4#.7zm1ho8ae ● https://habrahabr. ru/company/yandex/blog/239993/ ● http://gruntjs.com/getting-started ● http://frontendlabs.io/1669--gulp-js-en- espanol-tutorial-basico-primeros-pasos-y- ejemplos ● http://www.codeproject. com/Articles/1064203/Introduction-Style- Guidelines-and-Automation-Featu ● https://es.wikipedia.org/wiki/Tuber%C3% ADa_(inform%C3%A1tica) ● https://www.npmjs.com ● http://nightdeveloper.net/plugins-utiles-gulp/ ● https://osiux.ws/2014/12/utiles-plugins-para- gulp/ 21
  • 22. 22