39

I have installed the grunt task grunt-contrib-copy. I embedd it in my Gruntfile.js and load the task via grunt.loadNpmTasks('grunt-contrib-copy');.

Currently I use following configuration to create a folder with a subset of my js files/folders.

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/'}
                ]
            }
        }

This works fine, but everytime I run grunt copy it exits with the following error message:

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

I would like to exclude Gruntfile.js and all *.less files in js/**/*. Tried it with !(.less), !.less, !(*.less), !(./Grunfile.js), !(*Gruntfile.js) ... But nothing works. Added it to the processContentExclude array, but without success too.

So how can I exclude the Gruntfile.js and all less files in the folder structure js/**/*?

James
  • 80,725
  • 18
  • 167
  • 237
mybecks
  • 2,443
  • 8
  • 31
  • 43

5 Answers5

57

Found the solution:

There is no need for these lines:

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/'}
       ]

because {expand: true, cwd: './', src: ['**'], dest: 'output/'} is a new copy step, copying all files from ./ to output. Which is for me not needed, because the above lines are already copying the required files to output/toolkit.

So the following two lines does the job. No need for options or anything else. To keep out the *.less files '!**/*.less' does the job.

files: [ 
          {src: ['.conf1', '.conf2', 'config.js'], dest: 'output/toolkit/', filter: 'isFile'},
          {src: ['css/**', 'img/**', 'js/**', 'release/**', 'lib/**', 'locale/**', '!**/*.less'], dest: 'output/toolkit/'}
       ]
James
  • 80,725
  • 18
  • 167
  • 237
mybecks
  • 2,443
  • 8
  • 31
  • 43
15

I wanted to exclude all .gz files in my copy and this options did the job for all folders

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

So may be try !**/*.less, !gruntfile.js (no parens)

StackHola
  • 914
  • 9
  • 19
3

If you have the liberty to change to a different Grunt task:

There is also https://github.com/clavery/grunt-copy-to which has an explicit "ignore" option to specify files and directories to omit. The README in Github shows an example configuration including ignore options.

It works a bit different from the regular copy as it honours the modification times. But that might actually be welcome (it was in my case).

From the README:

Like grunt-contrib-copy but only copies files that are newer and maintains modified times for copied files. Useful for creating build directories that can be later synced using tools that rely on file modified times.

(I'm only a user of that project (at least so far).)

Risadinha
  • 16,058
  • 2
  • 88
  • 91
  • 2
    you actually don't need this property if you add the `!` to the patterns at the `src` property, and this is a pattern that can be used in any other grunt task. http://gruntjs.com/configuring-tasks#globbing-patterns – Felipe Sabino Sep 27 '13 at 21:27
3

Assuming that 'Gruntfile.js' is in root directory, the last line in your copy options is configuring it to copy everything in root to 'output/'.

If this is intended, add '!Gruntfile.js' to your array of src file paths.

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

Refer to these solutions from this thread and original thread

Community
  • 1
  • 1
daxeh
  • 1,083
  • 8
  • 12
0

I reckon this should do it. Not need for /**/*. /** covers all files in path and its subdirs

{src: ['./css/**', './img/**', './js/**', './release/**', './lib/**', './locale/**'], dest: 'output/toolkit/'},
{expand: true, cwd: './', src: ['**'], dest: 'output/'}
Thomas Bormans
  • 5,156
  • 6
  • 34
  • 51
Travis G
  • 1,592
  • 1
  • 13
  • 18
  • 1
    thanks for your answer, I've changed /**/* to /** but that didn't helps. Behaviour is still the same. – mybecks Mar 04 '13 at 12:02
  • Just wondering if you are running `Gruntfile.js` from locaton `output/Gruntfile.js`. If so please run it from some other location or exclude it. – Travis G Mar 04 '13 at 20:08
  • There is no need for my last line starting with {exapnd ...}. Only the two {src ...} lines are needed. – mybecks Mar 05 '13 at 11:16