Pregunta

Estoy intentando escribir tareas de trago que requieren alguna entrada del usuario a través del complemento de solicitud de trago.Pero tengo problemas para pasar esa entrada a otros, por ejemplo:

gulp.task('userinput', function(){

    var myVar = 'MONKEY';

    gulp.src('./templates/_component.*')
    .pipe(prompt.prompt([
        {
            type: 'input',
            name: 'userInput',
            message: 'Say something'
        }
    ], function(res){
        myVar = res.userInput;
    }))
    .pipe(prompt.confirm('You said ' + myVar));
});

Suponiendo que entro hello en el mensaje, esperaba que la confirmación dijera You said Hello, pero dice You said MONKEY.

¿Es esto posible con Gulp?

¿Fue útil?

Solución

El problema aquí es que está creando el segundo mensaje ('You said ' + myVar) antes se ha ejecutado el primer mensaje:

  1. Colocar myVar a 'MONKEY'
  2. Crear transmisiones
    1. Crear src flujo, que es asíncrono
    2. Cree el primer mensaje y agréguelo a la secuencia src
    3. Cree un segundo mensaje utilizando el valor actual de myVar, y agréguelo a la primera secuencia de mensajes.
  3. Sólo ahora se procesan los flujos ejecutados.
    1. Cargar fuentes
    2. Ejecute el primer mensaje, configure el myVar
    3. Ejecute el segundo mensaje usando el mensaje generado previamente

La única solución si desea mantenerlo todo como una sola secuencia es usar la variable dentro de algo que permita un cierre (función).Algunos complementos ya aceptan un cierre como argumento, pero la mayoría no.

Una solución para envolver una secuencia en un cierre que funcionaría aquí es trago-toque, que no está diseñado específicamente para este escenario, pero debería funcionar.se parece a esto:

var tap = require('gulp-tap');

//...

gulp.task('userinput', function(){

    var myVar = 'MONKEY';

    gulp.src('./templates/_component.*')
    .pipe(prompt.prompt([
        {
            type: 'input',
            name: 'userInput',
            message: 'Say something'
        }
    ], function(res){
        myVar = res.userInput;
    }))
    .pipe(tap(function(file, t) {
        // format is t.through(stream-function, [arguments...])
        return t.through(prompt.confirm, ['You said ' + myVar]);
    });
});

Debido a que esto está envuelto en un cierre y se evalúa para cada archivo, recogerá el actual valor de la variable. Sin embargo, debido a que funciona en cada archivo, verá el mensaje una vez por cada expediente procesado.


Una mejor solución sería separar su tarea en múltiples tareas dependientes.Se vería algo como esto:

var myVar = 'MONKEY';

gulp.task('userinput1', function(){

    return gulp.src('./templates/_component.*', {read: false})
        .pipe(prompt.prompt([
            {
                type: 'input',
                name: 'userInput',
                message: 'Say something'
            }
        ], function(res){
            myVar = res.userInput;
        }));
});

gulp.task('userinput', ['userinput1'], function() {
    return gulp.src('./templates/_component.*')
        .pipe(prompt.confirm('You said ' + myVar));
});

Ahora la primera tarea (userinput1) se ejecutará y completará antes el segundo se procesa (userinput2), por lo que la variable se configurará correctamente.

NOTA: Asegúrese return la secuencia de sus tareas; de lo contrario, se procesan sincrónicamente y su variable no se configurará.


Finalmente, podría tener más sentido renunciar a la gulp-prompt tarea por completo, porque en realidad no tiene mucho que ver con la transmisión.Probablemente sería mejor usar JavaScript de Nodo directamente dentro de su tarea para recopilar la entrada del usuario (preferiblemente de manera sincrónica) y luego procesar sus archivos en un flujo de trago después de eso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top