我的 glob 怎么了?

What's wrong with my glob?

我正在尝试为使用 minimatch 的东西编写一个 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

输出为:

"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' ]

你可以看到这个 here 的实时版本。

如您所见,它包括 teststub 文件。 我的 glob 需要什么才能排除这些文件?

这是 !(...) 语法的常见错误。想象一下这样的事情:

ls *!(.png|.jpg)

这不符合我们的要求,因为 .png.jpg* 匹配。所以一旦我们到达 !(.png|.jpg),字符串为空。

要修复它,我们可以这样做:

ls !(*.png|*.jpg)

因此,修正你的例子:

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

这里是a working example