Ausschluss des grunzenden Ordners (Minimatch / Glob)

74

Ich habe eine Situation, in der ich versuche, eine Codebasis mit Grunzen zu fusseln, mit Ausnahme bestimmter Ordner.

grunt verwendet minimatch (ähnlich wie bsdglob) unter der Haube, um Dateien abzugleichen, aber ich kann anscheinend nicht herausfinden, wie ein .gitignore-Stil einen Ordner ausschließt.

Ich möchte dies aufnehmen:

ignoreme

und passen Sie diese zusammen:

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

aber nicht mit diesen übereinstimmen:

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

Dies wird zu allem passen, einschließlich Ignoranz:

/**/*.js

Also dachte ich mir, ich könnte so etwas tun:

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

aber das stimmt mit Dateien im ignoreme-Ordner überein.

Ich bin an Regexe gewöhnt, kann aber anscheinend nicht herausfinden, wie man ein Muster oder etwas hier wiederholt - ich habe auch Dinge ausprobiert wie:

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

Ich hoffe, der Container würde sich wiederholen, aber das funktioniert nicht. Er passt einfach nicht zu allem.

Gibt es eine Möglichkeit, entweder einen regulären Ausdruck an grunzende Dateipfade zu übergeben oder diese Funktion für mich zu nutzen?

Aktualisieren:

So gehe ich derzeit mit diesem Problem um:

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

Es würde mich immer noch interessieren, ob Ordnerausschlüsse in Minimatch möglich sind.

Jesse
quelle
2
Die Verwendung von mapis filesenthält ein Array von TRUEund FALSEWerten. filterwird korrekt filesals Liste der gefilterten Pfade festgelegt.
Deefour
Richtig, müssen nachts getippt haben. Das Codebeispiel wurde aktualisiert, um zu funktionieren.
Jesse

Antworten:

148

In der derzeit in der Entwicklung befindlichen Version 0.4.0a unterstützt die grunt.file.expandMethode jetzt Ausschlüsse und dies auf eine wohl weniger komplexe Weise als die zugrunde liegende Minimatch-Matching-Bibliothek. Dies ist möglich, weil mehrere Muster grunt.file.expandakzeptiert werden (während Minimatch nur eines akzeptiert).

Aus der Dokumentation zu grunt.file.expand :

Diese Methode akzeptiert entweder durch Kommas getrennte Platzhaltermuster oder ein Array von Platzhaltermustern. Pfade, die mit Mustern übereinstimmen, die mit beginnen! wird aus dem zurückgegebenen Array ausgeschlossen. Muster werden in der richtigen Reihenfolge verarbeitet, sodass die Reihenfolge des Einschlusses und Ausschlusses von Bedeutung ist.

Das heißt, Sie können angeben, ['/**/*.js', '!**/ignoreme/**']und während das erste Muster alle .jsDateien zur Ergebnismenge hinzufügt , entfernt das zweite Muster dann alle /ignoreme/Dateien aus der Ergebnismenge.

Werfen Sie einen Blick auf die Unit-Tests grunt.file.match, wenn Sie wirklich neugierig sind.

Beachten Sie, dass die Version von grunt, die diese Funktionalität bietet, nicht offiziell veröffentlicht wurde. Wenn Sie jedoch daran interessiert sind, sie in einem Projekt zu verwenden, lesen Sie den Abschnitt Wann kann ich die in der Entwicklung befindliche Funktion 'X' verwenden? FAQ Eintrag.

Cowboy Ben Alman
quelle
Vielen Dank für die Antwort! Dies scheint eine viel elegantere Lösung für mein Problem zu sein - ich werde auf eine stabile Veröffentlichung warten, aber ich werde wechseln, wenn es herauskommt!
Jesse
14
Bemerkenswert: Ausschlussmuster funktionieren nur, wenn sie kommen, nachdem das, was sie ausschließen, mit einem Einschlussmuster abgeglichen wurde. War verwirrt, als ich meine Ausschlussmuster an die erste Stelle setzte.
Justin Searls
3
grunt watch --verboseum zu sehen, welche Dateien angesehen werden
Shanimal
Das ist großartig. Ich dachte, ich müsste einen seltsamen Filter schreiben, um eine Datei zu ignorieren.
Jeff