node.js - read - receive stream nodejs
¿Cómo interactúo con este objeto<File> en una secuencia node.js? (3)
Esos son objetos de vinyl . Son el tipo de datos central que se pasa a través de secuencias truculentas. Contienen información sobre el archivo (como información de la ruta y contenido como un búfer o flujo). Puedes ver mejor los datos usando gulp-debug .
Si desea mover un montón de archivos, a la vez que conserva su ruta relativa, puede realizar una de las siguientes acciones, sin necesidad de indagar en el código usted mismo:
gulp.src(''/a/single/src/path/**/*.foo'').pipe(gulp.dest(''/a/single/dest/path''));
O, si tienes un montón de globs diferentes:
gulp.src([''/a/src/path/foo/**/*.foo'', ''/a/src/path/bar/**/*.bar''], {base: ''/a/src/path/''})
.pipe(gulp.dest(''/a/dest/path/''));
La mayoría de las gulp.dest()
, utilizará los complementos de Gulp para manipular los archivos y luego gulp.dest()
el resultado a gulp.dest()
, en lugar de manipularlos usted mismo.
Si necesita manipular los archivos, hay algunos complementos que pueden ayudar:
- gulp-tap permite llegar al flujo y, opcionalmente, modificar el archivo o el búfer.
- vinyl-map te permite modificar fácilmente el contenido de los archivos.
- gulp-filter puede ayudarlo a filtrar el flujo si no funciona el globbing.
Estoy usando gulp para crear un flujo de archivos de coincidencia global y moverlos a todos, en su estructura anidada, a una nueva ubicación. Para hacer esto, primero quise crear un flujo simple para ver qué pasaba si lo canalizo desde gulp.src ().
Aquí está mi prueba gulpfile.js:
var through = require("through");
var fs = require("fs");
function write(file) {
console.log(file);
console.log(file.toString());
}
gulp.task("move", function () {
return gulp.src("./**")
.pipe(through(write));
});
Si ejecuto la tarea "mover" en la línea de comandos, obtengo una salida como la siguiente:
<File "some/path">
[object Object]
<File "some/path/file.js" <Buffer 2f 2a 0a 0a 4f 72 67 69 6e 61 6c 20 53 74 79 6c 65 20 66 72 6f 6d 20 65 74 68 61 6e 73 63 68 6f 6f 6e 6f 76 65 72 2e 63 6f 6d 2f 73 6f 6c 61 72 69 7a 65 ...>>
[object Object]
¿Qué son esos objetos? ¿Cómo puedo interactuar con ellos?
Para aquellos que también tropezaron con esto y no quieren usar trago, así es como lo hice:
Suponiendo que los files
son una matriz de objetos de vinyl -
const outputPath = ... // some directory path
files.forEach(file => {
const filePath = path.join(outputPath, file.relative);
// if its a directory then create the directory if not already present
if (file.isDirectory()) {
if (!fs.existsSync(filePath)) {
fs.mkdirSync(filePath, { recursive: true });
}
} else {
// if its a file then save the contents of the file
fs.writeFileSync(filePath, file.contents);
}
});
Puedes ver las propiedades del archivo usando este js:
var propValue;
for(var propName in file) {
propValue = file[propName];
console.log(''name:'' + propName, '', value:<<<'',propValue,''>>>'');
}
Sample Output
name:history , value:"C:/Temp/test.txt"
name:cwd , value:"C:/Temp"
name:base , value:"C:/Temp"
name:_contents , value: full file contents
name:isBuffer , value:"function () {
name:isStream , value:"function () {
name:isNull , value:"function () {
name:isDirectory , value:"function () {
name:clone , value:"function (opt) {
name:pipe , value:"function (stream, opt) {
name:inspect , value:"function () {
name:stat , value:<<< { dev: 0,
mode: 33206,
nlink: 1,
uid: 0,
gid: 0,
rdev: 0,
ino: 0,
size: 874,
atime: Sat Sep 19 2015 14:34:51 GMT+1000 (AUS Eastern Standard Time),
mtime: Sat Sep 19 2015 14:34:51 GMT+1000 (AUS Eastern Standard Time),
ctime: Sat Sep 12 2015 14:59:40 GMT+1000 (AUS Eastern Standard Time) } >>>
Usage:
console.log(''file name:'', file.relative);
console.log(''file current working directory:'', file.cwd);
console.log(''file isDirectory:'', file.isDirectory());