grunt.file.copy排除空文件夹

时间:2014-01-08 16:40:21

标签: gruntjs copy directory

file.copy(实际上是grunt-config-copy,但它下面使用了grunt.file.copy)。这对我来说很好,但我排除了某些glob模式。此排除导致一些空文件夹,文件夹仍然复制到新集。有没有办法排除空文件夹? 谢谢, RAIF

这是我的笨蛋任务

copy: {            
        release: {
                expand: true,
                deleteEmptyFolders:true,
                cwd:'<%= srcFolder %>',
                src: ['**',
                      '!**/obj/**',
                      '!**/*.cs',
                      '!**/*.vb',
                      '!**/*.csproj',
                      '!**/*.csproj.*'
               ],
               dest: '<%= destFolder %>',
               filter: function(filepath) {
                 var val = !grunt.file.isDir(filepath) || require('fs').readdirSync(filepath).length > 0;
                 grunt.log.write(val);
                 return val
              }
            }              
    }

日志显示返回了一些错误值,但我的desFolder中仍有几个空文件夹。

1 个答案:

答案 0 :(得分:3)

更新

我为grunt-contrib-copy制作了PR,但@shama提出了更好的解决方案。

您现在可以使用过滤器在所有grunt任务中处理此问题

copy: {
  main: {
    src: 'lib/**/*',
    dest: 'dist/',
    filter: function(filepath) {
      return ! grunt.file.isDir(filepath) || require('fs').readdirSync(filepath).length > 0;
    },
  },
},

您的案例存在的问题是这些文件夹不是空的,只是被排除在外。

一个好的解决方案是使用grunt-contrib-copy然后使用grunt-contrib-clean:

module.exports = function(grunt) {
  grunt.loadNpmTasks('grunt-contrib-clean');
  grunt.loadNpmTasks('grunt-contrib-copy');
  grunt.initConfig({
    copy: {
      main: {
        expand: true,
        cwd: 'src',
        src: ['**', '!**/*.js'],
        dest: 'dist/'
      }
    },
    clean: {
      main: {
        src: ['*/**'],
        filter: function(fp) {
          return grunt.file.isDir(fp) && require('fs').readdirSync(fp).length === 0;
        }
      }
    }
  });
  grunt.registerTask('copyclean', ['copy:main', 'clean:main']);
};