Исключение grunt (minimatch/glob) папок

У меня есть ситуация, когда я пытаюсь использовать grunt, чтобы скрыть кодовую базу, исключая определенные папки.

Grunt использует minimatch (похожий на bsdglob) под капотом для сопоставления файлов, но я не могу понять, как сделать стиль в стиле.gitignore, исключая папку.

Я хотел бы проглотить это:

ignoreme

и сопоставьте это:

/folder/path/here/to/something/ok.js
/another/folder/path.js
/test.js

но не соответствуют этим:

/folder/ignoreme/something.js
/folder/path/here/to/ignoreme/metoo/file.js

Это будет соответствовать всему, включая ignoreme:

/**/*.js

Поэтому я решил, что могу сделать что-то вроде:

/**/!(ignoreme)/**/*.js

но это соответствует файлам в папке ignoreme.

Я привык к регулярным выражениям, но не могу понять, как повторить шаблон или что-то здесь - я также попробовал что-то вроде:

/(!(ignoreme)|*)*/*.js

надеясь, что контейнер повторится, но это не сработает, просто оно не будет соответствовать всему.

Любой способ передать регулярное выражение для пути к файлу grunt или заставить это работать для меня?

Обновить:

Вот как я сейчас занимаюсь этой проблемой:

var pattern = /\/ignoreme\//
var files = grunt.file.expandFiles(arrayOfFilesPassedToMinimatch).filter(function(f){
  return !pattern.test(f)
})

Я все еще был бы заинтересован, если исключение папки возможно в мини-матче.

1 ответ

Решение

В текущей версии 0.4.0a grunt.file.expand Теперь метод поддерживает исключения и делает это, возможно, менее сложным способом, чем базовая библиотека соответствия minimatch. Это возможно, потому что grunt.file.expand принимает несколько шаблонов (тогда как minimatch принимает только один).

Из документации grunt.file.expand:

Этот метод принимает либо шаблоны подстановочных знаков, разделенные запятыми, либо массив шаблонов подстановочных знаков. Пути, соответствующие шаблонам, которые начинаются с! будет исключен из возвращенного массива. Шаблоны обрабатываются по порядку, поэтому порядок включения и исключения имеет большое значение.

Это означает, что вы могли бы указать ['/**/*.js', '!**/ignoreme/**'] и в то время как первый шаблон добавит все .js файлы в результирующий набор, второй шаблон будет затем удалить все /ignoreme/ файлы из набора результатов.

Посмотрите на модульные тесты grunt.file.match, если вам действительно интересно.

Обратите внимание, что версия grunt, предлагающая эту функциональность, официально не была выпущена, но если вы заинтересованы в ее использовании в проекте, см. Когда я смогу использовать функцию "X" в разработке? FAQ запись.

Другие вопросы по тегам