配置grunt copy任务,排除文件/文件夹

Configure grunt copy task to exclude files/folders

本文关键字:文件 文件夹 排除 grunt copy 任务 配置      更新时间:2023-09-26

我已安装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.

我想在js/**/*中排除Gruntfile.js和所有*.less文件。用!(.less), !.less, !(*.less), !(./Grunfile.js), !(*Gruntfile.js)试过了…但什么都没用。将它添加到processContentExclude数组中,但也没有成功。

那么我如何排除Gruntfile.js和文件夹结构js/**/*中的所有less文件?

找到解决方案:

不需要这些行:

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

我想在我的副本中排除所有.gz文件,这个选项对所有文件夹都有效

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

所以可以试试!**/*.less, !gruntfile.js(没有父母)

如果您可以自由地更改为其他Grunt任务:

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

它的工作方式与常规复制有点不同,因为它尊重修改时间。但这实际上可能是受欢迎的(我就是这样)。

来自README:

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

(我只是那个项目的一个用户(至少到目前为止))

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

如果这是有意的,添加'!Gruntfile.js'到你的src文件路径数组。

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

参考本线程和原线程的解决方案

我想这个应该可以了。不需要/**/*/**覆盖了path及其子目录

中的所有文件
{src: ['./css/**', './img/**', './js/**', './release/**', './lib/**', './locale/**'], dest: 'output/toolkit/'},
{expand: true, cwd: './', src: ['**'], dest: 'output/'}