Desarrollo de Sistemas Informáticos

3º. 2º cuatrimestre. Itinerario de Tecnologías de la Información. Grado en Ingeniería Informática. Curso 2019/2020


Organization ULL-ESIT-DSI-1920   Github Classroom DSI   Campus Virtual DSI   Profesores Casiano , Vicente , Manz

Table of Contents

Descripción de la práctica p2-t1-c3-filesystem

Capítulo 2 Wrangling the File System de Node.JS The Right Way

En este capítulo se desarrollan algunos programas sencillos que se encargan de vigilar un directorio o fichero por cambios y leen sus argumentos de la línea de comandos. Estos simples ejemplos les ofrecen una visión de como funciona el bucle de eventos de Node.js.

Este es un ejemplo similar a los ejemplos que encontrará en el capítulo con la diferencia de que usamos la librería commander.js para procesar los argumentos:

[~/.../sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ cat watcher-fortifying-code.js 
#!/usr/bin/env node
'use strict';
const fs = require("fs");
const program = require('commander');
const { version, description } = require('./package.json');

program
    .version(version)
    .description(description)
    .usage('[options]')
    .option('-f, --file <fileToWatch>', 'set the file or directory to watch', '.')

program.parse(process.argv);

const fileToWatch = program.file;

try {
  fs.watch(fileToWatch, { recursive: true }, (eventType, fileName) => {
    console.log(`File ${fileName} changed! Event Type: ${eventType}`);
    if (eventType === 'rename' && fileToWatch === fileName) {
      console.error(`No longer watching ${fileToWatch}!`);
      process.exit(1);
    }
  });
  console.log(`Now watching ${fileToWatch} for changes ...`);
} catch(e) {
   if (e.code === "ENOENT") console.error(`No file '${fileToWatch}' found`);
   else console.error(e)
}

Veamos un ejemplo de ejecución cuando no se pasan argumentos:

[~/.../sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ node watcher-fortifying-code.js 
Now watching . for changes ...
^C

Podemos usar la opción --help:

$ node watcher-fortifying-code.js --help
Usage: watcher-fortifying-code [options]

watch a file or directory for changes

Options:
  -V, --version             output the version number
  -f, --file <fileToWatch>  set the file or directory to watch (default: ".")
  -h, --help                output usage information

La opción -V:

$ node watcher-fortifying-code.js -V
1.0.0

El programa se nutre para la versión de la que está en el fichero package.json:

$ jq .version,.description  package.json 
"1.0.0"
"watch a file or directory for changes"

Si le pasamos la opción -f:

$ node watcher-fortifying-code.js -f target.txt
No file 'target.txt' found
[~/.../sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ touch target.txt
[~/.../sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ node watcher-fortifying-code.js -f target.txt
Now watching target.txt for changes ...

Ejercicio

The fs.watch API is not 100% consistent across platforms, and is unavailable in some situations. The recursive option is only supported on macOS and Windows. Para sistemas Linux es conveniente utilizar un wrapper como node-watch.

Ejercicios

Visual Studio Code y git

Tablero Kanban

Informe

En el README.md escriba un tutorial sobre lo que ha aprendido. Muestre imágenes o vídeos de su desarrollo con Visual Studio Code.

Recursos

Q & A

A que se refiere la pregunta “Instead, how would you take the process to spawn from process.argv?”

En el fichero watcher-spawn.js se hace un spawndel comando ls:

"use strict";
const
    fs = require('fs'),
    // The child_process module provides the ability to spawn child processes in a manner that is similar, but not identical, to popen
    spawn = require('child_process').spawn,
    filename = process.argv[2];

if (!filename) {
    throw Error("A file to watch must be specified!");
}

fs.watch(filename, function(eventType, fN) {
   
    let ls = spawn('ls', ['-lh', fN]);
    console.log(ls.pid);
    console.log(eventType, fN);
   
    ls.stdout.pipe(process.stdout);
});

console.log("Now watching " + filename + " for changes...");

lo que pide la pregunta es escribir una variante del programa anterior en la que el comando a ejecutar en vez de ser ls se especifique en la línea de comandos:

$ ./watcher-sol.js 
Usage:
  watcher-sol.js <fileName> [command] [args ... ]
$ ./watcher-sol.js . 'ls' '-l' 
Now watching . for changes...
-rw-r--r--  1 casiano  staff  1460 18 oct 08:37 watcher-fortifying-code.js
$ ./watcher-sol.js . echo "File change"
Now watching . for changes...
File change watcher-fortifying-code.js

El Libro Node.js 8 the Right Way

The JS Event Loop

VScode y Git

About GitHub project boards

About GH project boards

El libro EloquentJS. El capítulo 20 es sobre Node.js

El libro Node.js Beyond the Basics

Blog: Node.js Child Processes: Everything you need to know …

Comment with Disqus