2016-07-28 19 views
0

Ich schrieb das Snippet unten als Teil von grunt-aws-s3 Aufgabe. globbing - Korrekter Weg, um einige Dateierweiterungen, aber nicht andere zu vergleichen

var weekCache = 'css|js'; 
var yearCache = 'jpg|jpeg|png|gif|ico|eot|otf|ttf|woff|woff2'; 
var prodFiles = [ 
    {expand: true, cwd: 'public', src: ['**/*.!('+weekCache+'|'+yearCache+')'], dest: '/'}, 
    {expand: true, cwd: 'public', src: ['**/*[email protected]('+weekCache+')'], dest: '/', stream: true, params: {CacheControl: 'max-age=604800, public'}}, // enable stream to allow large files 
    {expand: true, cwd: 'public', src: ['**/*[email protected]('+yearCache+')'], dest: '/', stream: true, params: {CacheControl: 'max-age=31536000, public'}}, 
]; 

Die Idee ist, drei verschiedene Spiele innerhalb prodFiles Variable zu haben:

  1. Spiels alle Dateien mit Ausnahme der angepassten diejenigen von yearCache und weekCache
  2. Spiel aller Dateien mit in weekCache durch Erweiterungen
  3. Passen Sie alle Dateien mit Erweiterungen an, die in yearCache
übertragen werden

Es funktioniert mehr oder weniger, ich habe 63 Dateien innerhalb public Verzeichnis und seine Unterverzeichnisse. Wenn diese Regeln jedoch 72 Dateien entsprechen, ist es klar, dass einige Dateien mindestens zweimal übereinstimmen.

Was ist los mit meinem Globbing?

EDIT:

Testing mit node-glob-all dass Fehler gezeigt in dem ersten Muster ist:

$ glob-all '**/*.!(css|js)' 
assets/css/style-nuvue6sithwirecbhvw3dkaobiojqvtadsnhguwi7k04xklybw5djl1smadp.min.css 
assets/images/favicon.ico 
assets/js/jquery.fancybox.js 
assets/js/jquery.fancybox-thumbs.js 

Ich hatte erwartet, dieses Muster alles zurückzukehren, aber *.js und *.css auszuschließen. Beim Testen der anderen beiden Regeln wurden die korrekten Dateien zurückgegeben.

$ glob-all '**/*[email protected](css|js)' 
assets/css/style-nuvue6sithwirecbhvw3dkaobiojqvtadsnhguwi7k04xklybw5djl1smadp.min.css 
assets/js/jquery.fancybox.js 
assets/js/jquery.fancybox-thumbs.js 

Also, die Frage ist, wie man richtig '**/*.!(css|js)' das Muster negieren?

Antwort

2

Ich glaube, Ihr Problem besteht darin, dass Ihre Dateinamen mehrere Punkte (.) Enthalten.

Ihr Muster gibt an, dass alle Dateinamen gefunden werden sollen, die eine Anzahl von Nicht-Punkt-Zeichen haben, gefolgt von einem Punkt-Zeichen gefolgt von anderen Zeichen als "css" oder "js".

Nehmen wir zum Beispiel den Dateinamen "jquery.fancybox.js". Mit diesem Dateinamen finden wir einige nicht-Punkt-Zeichen, "jquery", gefolgt von einem Punkt, ".", Gefolgt von Zeichen, die nicht "css" sind und nicht "js", "fancybox.js". Dieser Dateiname stimmt mit dem Muster überein und wird daher zurückgegeben.

Wenn der obige Dateiname "fancybox.js" wäre, hätte er einige nicht-Punkt-Zeichen, "fancybox", gefolgt von einem Punkt, ".", Aber nicht gefolgt von Zeichen, die nicht " css "und nicht" js ". Daher würde dieser Dateiname die Musterübereinstimmung nicht bestehen und würde nicht zurückgegeben werden.

Wir wollen in unserem Negationsmuster angeben, dass es vor unserer Erweiterung ".css" oder ".js" mehr Punkte geben kann, die nicht mit Punkten versehen sind. Wir können dies mit folgendem Muster tun:

'**/*.!(*(*.)js|*(*.)css)' 
+0

Hervorragende Erklärung. Vielen Dank. – JrBenito

+0

Ich denke, das Globbing, das Sie vorgeschlagen haben, fängt keine Dateien ohne Punkt (e), habe ich Recht? – JrBenito

+1

Das ist richtig. – 76484