配置grunt复制任务以排除文件/文件夹

时间:2013-03-04 10:12:11

标签: javascript copy gruntjs

我已经安装了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 copy时都会退出并显示以下错误消息:

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/**/*和所有较少的文件?

5 个答案:

答案 0 :(得分:53)

找到解决方案:

不需要这些行:

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

答案 1 :(得分:14)

我想要排除我副本中的所有.gz文件,这个选项可以完成所有文件夹的工作

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

所以可能会尝试!**/*.less, !gruntfile.js(没有parens)

答案 2 :(得分:3)

如果您可以自由更改为不同的Grunt任务:

还有https://github.com/clavery/grunt-copy-to,它有一个明确的“忽略”选项来指定要省略的文件和目录。 Github中的README显示了一个示例配置,包括忽略选项。

它与常规副本有点不同,因为它符合修改时间。但实际上这可能是受欢迎的(这是我的情况)。

来自自述文件:

  

与grunt-contrib-copy类似,但仅复制较新的文件并维护复制文件的修改时间。用于创建构建目录,以后可以使用依赖于文件修改时间的工具同步。

(我只是该项目的用户(至少到目前为止)。)

答案 3 :(得分:3)

假设'Gruntfile.js'在根目录中,复制选项中的最后一行是将其配置为将root中的所有内容复制到'output /'。

如果是这样,请将'!Gruntfile.js'添加到您的src文件路径数组中。

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

请参阅此threadoriginal thread

中的这些解决方案

答案 4 :(得分:0)

我认为应该这样做。不需要/**/*/**涵盖路径及其子目录中的所有文件

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