2012-09-28 13 views
73

Tengo una situación en la que intento usar grunt para eliminar una base de código, excluyendo carpetas específicas.grunt (minimatch/glob) exclusión de carpeta

grunt usa minimatch (similar a bsdglob) debajo del capó para hacer coincidir los archivos, pero parece que no puedo encontrar la forma de excluir una carpeta de un estilo .gitignore.

me gustaría ingerir esto:

ignoreme

y que cumplan estas:

/folder/path/here/to/something/ok.js 
/another/folder/path.js 
/test.js 

pero no coincida con estas:

/folder/ignoreme/something.js 
/folder/path/here/to/ignoreme/metoo/file.js 

Esto coincidirá con todo, incluso ignoreme:

/**/*.js 

por lo que pensé que podía hacer algo como:

/**/!(ignoreme)/**/*.js 

pero que coincide con los archivos en la carpeta ignoreme.

Estoy acostumbrado a expresiones regulares, pero parece que no puede encontrar la manera de repetir un patrón o algo aquí - También probé cosas como:

/(!(ignoreme)|*)*/*.js 

esperando que el contenedor se repetiría, Pero eso no No funciona, simplemente no combina todo.

¿Alguna manera de pasar un regex a rutas de archivos grupadas, o hacer que esto funcione para mí?

Actualización:

Así es como estoy actualmente se ocupan de este asunto:

var pattern = /\/ignoreme\// 
var files = grunt.file.expandFiles(arrayOfFilesPassedToMinimatch).filter(function(f){ 
    return !pattern.test(f) 
}) 

Todavía estaría interesado si excluye las carpetas son posibles en minimatch.

+2

El uso de 'map' es el resultado en' archivos' que contiene una matriz de valores 'TRUE' y' FALSE'. 'filter' establecerá correctamente' files' para que sea una lista de rutas filtradas. – deefour

+0

Tienes razón, debes haber escrito a máquina por la noche. Se actualizó la muestra del código para que funcione. – Jesse

Respuesta

148

En la versión 0.4.0a actualmente en desarrollo, el método grunt.file.expand ahora admite exclusiones, y lo hace de una manera posiblemente menos compleja que la biblioteca de coincidencia de minimotos subyacente. Esto es posible porque grunt.file.expand acepta patrones múltiples (mientras que minimatch solo acepta uno).

De the grunt.file.expand documentation:

Este método acepta ya sea separados por comas patrones de comodines o una matriz de patrones de comodines. Rutas que coinciden con los patrones que comienzan! se excluirá de la matriz devuelta. Los patrones se procesan en orden, por lo que el orden de inclusión y exclusión es significativo.

Eso significa que podría especificar ['/**/*.js', '!**/ignoreme/**'] y mientras el primer patrón añadiría todos .js archivos en el conjunto de resultados, el segundo patrón entonces le quite todos los archivos /ignoreme/ del conjunto de resultados.

Eche un vistazo a grunt.file.match unit tests si tiene mucha curiosidad.

Tenga en cuenta que la versión de grunt que ofrece esta funcionalidad no se ha lanzado oficialmente, pero si le interesa usarla en un proyecto, consulte la entrada When will I be able to use in-development feature 'X'? de preguntas frecuentes.

+0

¡Muchas gracias por la respuesta! Esto parece una solución mucho más elegante para mi problema. Esperaré a que se produzca un lanzamiento estable, pero cambiaré cuando salga. – Jesse

+14

Merece la pena señalar: los patrones de exclusión solo funcionan si aparecen * DESPUÉS de * lo que sea que es lo que excluyen ha sido emparejado por un patrón de inclusión. Estaba confundido al poner mis patrones de exclusión primero. –

+3

'grunt watch --verbose' para ver qué archivos se están viendo – Shanimal

Cuestiones relacionadas