【发布时间】:2016-07-28 22:00:48
【问题描述】:
我在下面写了 sn-p 作为grunt-aws-s3 任务的一部分。
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: ['**/*.@('+weekCache+')'], dest: '/', stream: true, params: {CacheControl: 'max-age=604800, public'}}, // enable stream to allow large files
{expand: true, cwd: 'public', src: ['**/*.@('+yearCache+')'], dest: '/', stream: true, params: {CacheControl: 'max-age=31536000, public'}},
];
这个想法是在prodFiles 变量中拥有三个不同的匹配项:
- 匹配除
yearCache和weekCache匹配的文件之外的所有文件 - 匹配
weekCache中带有扩展名的所有文件 - 匹配
yearCache中带有扩展名的所有文件
它或多或少可以工作,我在public 目录及其子目录中有 63 个文件。但是这些规则匹配 72 个文件,很明显有些文件至少匹配了两次。
我的 globbing 有什么问题?
编辑:
使用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 '**/*.@(css|js)'
assets/css/style-nuvue6sithwirecbhvw3dkaobiojqvtadsnhguwi7k04xklybw5djl1smadp.min.css
assets/js/jquery.fancybox.js
assets/js/jquery.fancybox-thumbs.js
那么,问题是如何正确否定模式'**/*.!(css|js)'?
【问题讨论】:
标签: javascript node.js gruntjs glob node-glob