grunt-contrib-copy排除文件列表

时间:2017-03-12 21:02:25

标签: javascript json gruntjs copy

我使用grunt和grunt-contrib-copy; 我的目标:我想将文件夹中的所有文件复制到另一个文件夹,但可配置的文件列表

  copy: {
    files: [{
     expand:true, 
     cwd: './dist/Assets/',
     src: [
      '**/*',
      '!{Css,Images}/**/*',
      '!Js/{filetoexlude1.js,filetoexclude2.js}'  
      ], 
    filter: 'isFile',    
    dest:'./deploy/Assets/'
}]  
}

由于我不想在任务中编写文件列表,我用这个内容编写了一个名为files.json的json文件:

{  
"filestoexcludefromcopy":[
"filetoexclude1.js",
"filetoexclude2.js"
]
}

在Gruntfile.js中:

filestoexcludefromcopy: grunt.file.readJSON('files.json').filestoexcludefromcopy,

并修改了我的任务:

  copy: {
files: [{
  expand:true, 
  cwd: './dist/Assets/',
  src: [
    '**/*',
    '!{Css,Images}/**/*',
    '!Js/{<%= filestoexcludefromcopy%>}'  
    ], 
  filter: 'isFile',    
  dest:'./deploy/Assets/'
}]  
}

运行良好...除了在files.json内部只有一个文件...有人可以帮我正确配置任务吗?谢谢!

1 个答案:

答案 0 :(得分:0)

修改

length数组的filestoexcludefromcopy为1时,Grunt似乎以不同方式处理template

为了避免这种怪癖,当filestoexcludefromcopy只有一个时,您可以将空项目推送到length数组。

虽然这不是特别优雅 - 但它运作成功。

<强> Gruntfile.js

filestoexcludefromcopy: (function() {
    var files = grunt.file.readJSON('files.json').filestoexcludefromcopy;
    if (files.length === 1) {
        files.push(''); // Ensures files array length is greater than 1.
    }
    return files;
}()),

copy: {
    foo: { // Added a target
        files: [{
            expand: true,
            cwd: './dist/Assets/',
            src: [
                '**/*',
                '!{Css,Images}/**/*',
                '!Js/{<%= filestoexcludefromcopy%>}'
            ],
            filter: 'isFile',
            dest: './deploy/Assets/'
        }]
    }
}

原始回答

从模板中删除花括号{}。即改变这个:

'!Js/{<%= filestoexcludefromcopy%>}'

到此:

'!Js/<%= filestoexcludefromcopy%>'

注意:在下面的要点中,copy任务中也添加了Target

<强> Gruntfile.js

//...
filestoexcludefromcopy: grunt.file.readJSON('files.json').filestoexcludefromcopy,

copy: {
    foo: { // Add a Target to the 'copy' Task
        files: [{
            expand: true,
            cwd: './dist/Assets/',
            src: [
                '**/*',
                '!{Css,Images}/**/*',
                '!Js/<%= filestoexcludefromcopy%>' // Remove the curly braces.
            ],
            filter: 'isFile',
            dest: './deploy/Assets/'
        }]
    }
}
//...