3º. 2º cuatrimestre. Itinerario de Tecnologías de la Información. Grado en Ingeniería Informática. Curso 2019/2020
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 ...
-r --recursive
que indica si watch
debe hacer una vigilancia recursiva.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.
process.argv
?process.argv
to the spawned process?
node watcher-spawn-cmd.js target.txt ls -l -h
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.
En el fichero watcher-spawn.js
se hace un spawn
del 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