2016-07-28 59 views
0

我写下面的片段作为grunt-aws-s3任务的一部分。globbing - 正确匹配某些文件扩展名但不匹配的方法

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'}}, 
]; 

的想法是有三个不同的比赛里prodFiles变量:

  1. 匹配所有除非yearCacheweekCache
  2. 匹配的全部文件weekCache
  3. 进行扩展匹配的那些文件匹配所有带有扩展名的文件yearCache

它或多或少地工作,我有public目录及其子目录中的63个文件。但是,这些规则匹配72个文件,显然有些文件至少匹配两次。

我的通配符有什么问题?

编辑:

测试与显示错误node-glob-all在第一图案:

$ 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 

我期待这种模式返回的一切,但排除*.js*.css。针对其他两个规则进行测试返回正确的文件。

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

所以,问题是如何正确地否定模式'**/*.!(css|js)'

回答

2

我相信你的问题是你的文件名包含多个点(。)。

您的模式指定查找所有包含一些非点号字符的文件名,后面跟一个点号字符,后跟除“css”或“js”以外的任何字符。

让我们来看一个例如文件名“jquery.fancybox.js”。使用这个文件名,我们发现有一些非点字符“jquery”,后面跟着一个点“。”,后面跟着不是“css”的字符而不是“js”,“fancybox.js”。该文件名称与模式匹配,因此返回。

有了上面的文件名是“fancybox.js”,它会通过一个点都匹配的一些非点的字符,“的fancybox”,随后,”。‘而不是后面的字符不在’ css“而不是”js“。因此这个文件名将会失败模式匹配并且不会被返回。

我们想要做的是在我们的否定模式中指定在我们的“.css”或“.js”扩展名之前可能会有更多的非点字符。我们可以用以下模式做到这一点:

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

优秀的解释。谢谢。 – JrBenito

+0

我认为,你提出的globbing没有捕获没有点的文件,我说得对吗? – JrBenito

+1

这是正确的。 – 76484

相关问题