2016-06-16 12 views
3

Ich versuche, einen Glob für etwas zu schreiben, das minimatch verwendet und Probleme beim Ausschließen der Dateien, die ich möchte. Hier ist ein Testfall:Was ist los mit meinem Glob?

const glob = 'src/js/*!(test|stub).js' // this is the glob I'm trying to work out 

const shouldMatch = [ 
    'src/js/foo.js', 
    'src/js/bar.js', 
    'src/js/baz.js', 
] 

const shouldNotMatch = [ 
    'src/js/foo.test.js', 
    'src/js/bar.stub.js', 
    'src/baz/blob.js', 
] 

const all = shouldMatch.concat(shouldNotMatch) 

const matched = minimatch.match(all, glob) // https://www.npmjs.com/package/minimatch 

expect(matched).toEqual(shouldMatch) // https://npmjs.com/package/expect 

Die Ausgabe mit diesem ist:

"Error: Expected [ 'src/js/foo.js', 'src/js/bar.js', 'src/js/baz.js', 'src/js/foo.test.js', 'src/js/bar.stub.js' ] to equal [ 'src/js/foo.js', 'src/js/bar.js', 'src/js/baz.js' ] 

Sie können eine Live-Version dieser here sehen.

Wie Sie sehen können, enthält es sowohl die test als auch die stub Dateien. Was muss mein Glob sein, damit diese Dateien ausgeschlossen sind?

+0

Ihre glob ist ein String kein reguläres Ausdruck –

+0

const glob = 'src/js/* (foo | bar | baz) .js' ist ihr jedes Problem beim Ausprobieren dieser Regex? Abgesehen davon, dass es sehr lang sein kann! –

+0

Ja, das ist ein isoliertes Beispiel, um das Kernproblem einfacher zu lösen. In Wirklichkeit habe ich viel mehr Dateien (und werde mehr Überstunden hinzufügen). Ich muss das wirklich funktionieren wie codiert. Außerdem gebe ich den Glob an eine dritte Partei weiter, also kann ich keine Regex verwenden, es muss ein echter Glob sein. – kentcdodds

Antwort

7

Dies ist ein häufiger Fehler bei der Syntax !(...). so etwas wie dies vorstellen:

ls *!(.png|.jpg)

dies nicht tun, was wir wollen, weil die .png und .jpg werden durch die * abgestimmt. Sobald wir also zu !(.png|.jpg) gelangen, ist der String null.

es zu beheben, was wir tun können:

ls !(*.png|*.jpg)

So Ihrem Beispiel zu beheben:

const glob = 'src/js/!(*test|*stub).js'

Hier a working example

+1

Fantastisch. Danke Chris! – kentcdodds