globbing - правильный способ сопоставления некоторых расширений файлов, но не других

Я написал фрагмент ниже как часть 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 переменная:

  1. Подберите все файлы, кроме тех, которые соответствуют yearCache а также weekCache
  2. Подберите все файлы с расширениями weekCache
  3. Подберите все файлы с расширениями yearCache

Работает более-менее, у меня внутри 63 файла public каталог и его подкаталоги. Однако эти правила соответствуют 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 '**/*.@(css|js)'
assets/css/style-nuvue6sithwirecbhvw3dkaobiojqvtadsnhguwi7k04xklybw5djl1smadp.min.css
assets/js/jquery.fancybox.js
assets/js/jquery.fancybox-thumbs.js

Итак, вопрос в том, как правильно отрицать шаблон '**/*.!(css|js)' ?

1 ответ

Решение

Я считаю, что ваша проблема в том, что ваши имена файлов содержат несколько точек (.).

В вашем шаблоне указывается, что нужно найти все имена файлов, которые содержат некоторое количество не-точечных символов, за которыми следует символ точки, за которым следуют любые символы, кроме "css" или "js".

Давайте возьмем, к примеру, имя файла "jquery.fancybox.js". С этим именем файла мы находим несколько не точечных символов "jquery", за которыми следуют точка ".", За которыми следуют символы, которые не являются "css" и не "js", "fancybox.js". Это имя файла соответствует шаблону и, таким образом, возвращается.

Если бы указанное выше имя файла было "fancybox.js", оно соответствовало бы некоторым не точечным символам "fancybox", за которыми следовала бы точка ".", Но не сопровождалось бы символами, которые не являются "css" и не "js". ". Таким образом, это имя файла не будет соответствовать шаблону и не будет возвращено.

Что мы хотим сделать, это указать в нашем шаблоне отрицания, что перед расширением ".css" или ".js" может быть больше не-точечных символов. Мы можем сделать это с помощью следующего шаблона:

'**/*.!(*(*.)js|*(*.)css)'
Другие вопросы по тегам