2012-09-28 5 views
73

Ho una situazione in cui sto cercando di usare grunt per filtrare un codebase, escludendo cartelle specifiche.esclusione cartella grunt (minimatch/glob)

grunt utilizza minimatch (simile a bsdglob) sotto il cofano per abbinare i file, ma non riesco a capire come fare a escludere uno stile .gitignore di una cartella.

mi piacerebbe ingerire questo:

ignoreme

e abbinare questi:

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

ma non corrispondono questi:

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

Questo corrisponderanno tutto, compreso il ignoreme:

/**/*.js 

Così ho pensato che avrei potuto fare qualcosa di simile:

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

ma che corrisponde file nella cartella ignoreme.

Sono abituato a espressioni regolari, ma non riesco a capire come ripetere un modello o qualcosa qui - Ho anche provato cose come:

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

sperando contenitore ripeteva, ma che doesn Funziona, non riesce a eguagliare tutto.

Un modo per passare una regex a percorsi di file grunt o renderlo funzionante per me?

Aggiornamento:

Ecco come sto attualmente si occupano di questo problema:

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

Sarei ancora interessato se esclude cartelle sono possibili in minimatch.

+2

L'uso di 'map' è un risultato in' file' contenente una matrice di valori 'TRUE' e 'FALSE'. 'filter' imposterà correttamente' files' per essere una lista di percorsi filtrati. – deefour

+0

Proprio così, devi aver digitato durante la notte. Aggiornato il codice di esempio per funzionare. – Jesse

risposta

148

Nella versione attualmente in fase di sviluppo 0.4.0a, il metodo grunt.file.expand ora supporta le esclusioni e lo fa in un modo probabilmente meno complesso rispetto alla libreria di corrispondenza minimatch sottostante. Questo è possibile perché grunt.file.expand accetta più modelli (mentre il valore minimo accetta solo uno).

Da the grunt.file.expand documentation:

Questo metodo accetta o separate da virgole modelli asterisco o una serie di modelli jolly. Percorsi che corrispondono a modelli che iniziano con! sarà escluso dall'array restituito. I pattern vengono elaborati in ordine, pertanto l'inclusione e l'ordine di esclusione sono significativi.

Ciò significa che è possibile specificare ['/**/*.js', '!**/ignoreme/**'] e mentre il primo modello dovrebbe aggiungere tutti .js file al set di risultati, il secondo modello sarebbe quindi rimuovere tutti i file /ignoreme/ dal set di risultati.

Dai uno sguardo allo grunt.file.match unit tests se sei davvero curioso.

Si noti che la versione di grunt che offre questa funzionalità non è stata rilasciata ufficialmente, ma se si è interessati ad utilizzarla in un progetto, consultare la voce Domande frequenti When will I be able to use in-development feature 'X'?.

+0

Grazie mille per la risposta! Questa sembra una soluzione molto più elegante al mio problema - aspetterò una versione stabile, ma cambierò quando sarà fuori! – Jesse

+14

Vale la pena notare: i pattern di esclusione funzionano solo se vengono visualizzati * AFTER * qualunque sia-è-essi-escludi è stato abbinato a un pattern di inclusione. Sono stato confuso mettendo prima i miei schemi di esclusione. –

+3

'grunt watch --verbose' per vedere quali file vengono guardati – Shanimal