Подтвердить что ты не робот

Настройка задачи копирования grunt для исключения файлов/папок

Я установил задачу grunt grunt-contrib-copy. Я вставляю его в свой Gruntfile.js и загружаю задачу через grunt.loadNpmTasks('grunt-contrib-copy');.

В настоящее время я использую следующую конфигурацию для создания папки с подмножеством моих js файлов/папок.

copy: {
            options: {
                processContent: [],
                processContentExclude: ['build/**', 'bin/**', '.*', '*.orig', '*.bak', '.*/**', '*.log', 'dist/**', 'test/**', 'dev/**', 'pyserver/**', 'node_modules/**', 'doc/**']
            },
            du: {
                files: [ 
                    {src: ['.conf1', '.conf2', './config.js'], dest: 'output/toolkit/', filter: 'isFile'},
                    {src: ['./css/**/*', './img/**/*', './js/**/*', './release/**/*', './lib/**/*', './locale/**/*'], dest: 'output/toolkit/'},
                    {expand: true, cwd: './', src: ['**'], dest: 'output/'}
                ]
            }
        }

Это отлично работает, но каждый раз, когда я запускаю grunt-копию, он выходит со следующим сообщением об ошибке:

Copying Gruntfile.js -> output/Gruntfile.js
Warning: Error while processing "Gruntfile.js" file. Use --force to continue.

Я хотел бы исключить Gruntfile.js и все *.less файлы в js/**/*. Пробовал это с помощью !(.less), !.less, !(*.less), !(./Grunfile.js), !(*Gruntfile.js)... Но ничего не работает. Добавил его в массив processContentExclude, но без успеха тоже.

Итак, как я могу исключить Gruntfile.js и все меньше файлов в структуре папок js/**/*?

4b9b3361

Ответ 1

Найдено решение:

Нет необходимости в этих строках:

files: [ 
          {src: ['.conf1', '.conf2', './config.js'], dest: 'output/toolkit/', filter: 'isFile'},
          {src: ['./css/**/*', './img/**/*', './js/**/*', './release/**/*', './lib/**/*', './locale/**/*'], dest: 'output/toolkit/'},
          {expand: true, cwd: './', src: ['**'], dest: 'output/'}
       ]

потому что {expand: true, cwd: './', src: ['**'], dest: 'output/'} - это новый шаг копирования, копируя все файлы с ./ до output. Это для меня не нужно, потому что указанные выше строки уже копируют необходимые файлы в output/toolkit.

Итак, следующие две строки выполняют эту работу. Нет необходимости в вариантах или что-то еще. Для сохранения *.less файлов '!**/*.less' выполняется задание.

files: [ 
          {src: ['.conf1', '.conf2', 'config.js'], dest: 'output/toolkit/', filter: 'isFile'},
          {src: ['css/**', 'img/**', 'js/**', 'release/**', 'lib/**', 'locale/**', '!**/*.less'], dest: 'output/toolkit/'}
       ]

Ответ 2

Я хотел исключить все .gz файлы в свою копию, и эти параметры выполнили задание для всех папок

{
  expand: true,
  cwd:    './build/www/',
  src:    [ '**', '!**/*.gz' ],
  dest:   './mydDest'
}

Итак, можно попробовать !**/*.less, !gruntfile.js (no parens)

Ответ 3

Если у вас есть свобода, чтобы перейти к другой задаче Grunt:

Существует также https://github.com/clavery/grunt-copy-to, у которого есть явная опция "игнорировать", чтобы указать файлы и каталоги для пропусков. README в Github показывает пример конфигурации, включая опции игнорирования.

Он немного отличается от обычной копии, поскольку он соблюдает время модификации. Но это может быть действительно приветствуется (это было в моем случае).

Из README:

Подобно grunt-contrib-copy, но только копирует файлы, которые новее, и поддерживает измененные времена для скопированных файлов. Полезно для создания каталогов сборки, которые могут быть позже синхронизированы с использованием инструментов, которые зависят от времени, измененного файлом.

(Я только пользователь этого проекта (по крайней мере до сих пор).)

Ответ 4

Предполагая, что "Gruntfile.js" находится в корневом каталоге, последняя строка в ваших параметрах копирования настраивает его, чтобы скопировать все в корневом каталоге в 'output/'.

Если это необходимо, добавьте '! Gruntfile.js' в ваш массив путей файла src.

{
  expand: true, 
  cwd: './', 
  src: ['**'],      // ex. src: ['**',  '!Gruntfile.js'],
  dest: 'output/'
}

Обратитесь к этим решениям из этого потока и исходного потока

Ответ 5

Я считаю, что это должно сделать это. Не требуется для /**/*. /** охватывает все файлы в пути и его поддиректории

{src: ['./css/**', './img/**', './js/**', './release/**', './lib/**', './locale/**'], dest: 'output/toolkit/'},
{expand: true, cwd: './', src: ['**'], dest: 'output/'}