validar validacion vacios formularios formulario enviar ejemplos con codigo carga campos asincrona antes javascript gruntjs grunt-contrib-qunit

javascript - validacion - Continuar ciertas tareas en gruñido incluso si uno falla



validar formulario javascript html5 (5)

Aquí hay una solución. No es bonito, pero resuelve el problema.

Crea dos tareas adicionales que puede ajustar al principio / al final de cualquier secuencia que desee continuar, incluso en caso de fallo. La comprobación del valor existente de grunt.option(''force'') es para que no sobrescriba ninguna grunt.option(''force'') desde la línea de comando.

grunt.registerTask(''usetheforce_on'', ''force the force option on if needed'', function() { if ( !grunt.option( ''force'' ) ) { grunt.config.set(''usetheforce_set'', true); grunt.option( ''force'', true ); } }); grunt.registerTask(''usetheforce_restore'', ''turn force option off if we have previously set it'', function() { if ( grunt.config.get(''usetheforce_set'') ) { grunt.option( ''force'', false ); } }); grunt.registerTask( ''myspecialsequence'', [ ''usetheforce_on'', ''task_that_might_fail_and_we_do_not_care'', ''another_task'', ''usetheforce_restore'', ''qunit'', ''task_that_should_not_run_after_failed_unit_tests'' ] );

También he enviado una solicitud de función para que Grunt lo respalde de forma nativa.

¿Hay alguna forma de configurar una secuencia de tareas para que se ejecuten las siguientes (no quiero - forzar en todo el lote) incluso si falla una? Por ejemplo, considere un caso como este

  1. Crea algunos archivos temporales
  2. Ejecutar algunas pruebas unitarias que involucran esos archivos temporales
  3. Limpia esos archivos temporales

Puedo hacer esto:

grunt.registerTask(''testTheTemp'', [''makeTempFiles'', ''qunit'', ''removeTempFiles'']);

Pero si qunit falla, la tarea removeTempFiles nunca se ejecuta.


El único problema con el uso del grunt-force-task mencionado anteriormente es que el proceso grunt ahora saldrá incondicionalmente con 0 (lo que significa que se pasa).

Esto es un problema si desea utilizar grunt en un entorno de CI (integración continua) y falla la tarea de CI en función de si su prueba / construcción ( qunit en el OP) pasa o falla. He this.requires este problema agregando una nueva tarea que utiliza la función this.requires de this.requires para comprobar si qunit aprobó o no:

grunt.registerTask(''exitWithQunitStatus'', function() { this.requires([''qunit'']); return true; }) grunt.registerTask(''testTheTemp'', [''makeTempFiles'', ''force:qunit'', ''removeTempFiles'', ''exitWithQunitStatus'']);

Ahora, si qunit falla, el gruñido saldrá con 3, lo que indica un Task Error . Sin el exitWithQunitStatus , el proceso grunt se cerrará con 0.

this.requires se documenta aquí: http://gruntjs.com/api/inside-tasks#this.requires . Básicamente, fallará la tarea actual a menos que todas las tareas "requeridas" especificadas ya se hayan ejecutado y aprobado.


Haciendo eco del comentario de Marius, el grunt-force-task ahora proporciona esta funcionalidad. Detalles completos siguiendo el enlace anterior, pero en pocas palabras, esto es lo que necesita para lograr el efecto deseado

npm install grunt-force-task --save-dev

Luego importarlo en su archivo de gruñido

grunt.loadNpmTasks(''grunt-force-task'');

Finalmente, simplemente agregue el forzado: prefijo a la (s) tarea (s) antes de la que siempre desea ejecutar.

grunt.registerTask(''testTemp'', [''makeTempFiles'', ''force:qunit'', ''removeTempFiles'']);

Ahora removeTempFiles siempre se ejecutará incluso si la prueba falla.


Para la posteridad, esto podría ser un truco mejorado mientras esperamos que las relaciones públicas de @explunit caigan en gruñido:

var previous_force_state = grunt.option("force"); grunt.registerTask("force",function(set){ if (set === "on") { grunt.option("force",true); } else if (set === "off") { grunt.option("force",false); } else if (set === "restore") { grunt.option("force",previous_force_state); } }); // ..... grunt.registerTask("foobar",[ "task1", "task2", "force:on", // temporarily turn on --force "task3", // will run with --force in effect "force:restore",// restore previous --force state "task4" ]);


Quizás pueda crear una tarea grunt.util.spawn async y grunt.util.spawn sus tareas deseadas en serie. Luego puede escribir algo de lógica condicional para los códigos de éxito / error. Algo similar a la respuesta a esta question