动态运行concat任务,动态创建目标文件

时间:2013-08-01 14:38:11

标签: gruntjs grunt-contrib-concat

我在其中一个项目上运行grunt concat任务,看起来像这样:

/**
 * Concatenate | Dependencies Scripts
 */

concat: {
    dependencies: {
        files: {        
            "./Ditcoop/js/plugins.min.js": ["./Ditcoop/js/vendor/**/*.min.js", "!./Ditcoop/js/vendor/modernizr/*.js", "!./Ditcoop/js/vendor/jquery/*.js"],
            "./Global/js/plugins.min.js": ["./Global/js/vendor/**/*.min.js", "!./Global/js/vendor/modernizr/*.js", "!./Global/js/vendor/jquery/*.js"],
            "./Webshop/js/plugins.min.js": ["./Webshop/js/vendor/**/*.min.js", "!./Webshop/js/vendor/modernizr/*.js", "!./Webshop/js/vendor/jquery/*.js"]
        }
    }
}

我的问题是,如果我能够以某种方式使其更加动态,而无需指定每个根文件夹。我在考虑这样的事情:

    concat: {
    dependencies: {
        files: {        
            "./*/js/plugins.min.js": ["./*/js/vendor/**/*.min.js", "!./*/js/vendor/modernizr/*.js", "!./*/js/vendor/jquery/*.js"],
        }
    }
}

我很确定我不能这样做,但我可以使用expand选项,我只是不确定如何使用它所以我可以在右边这样做根文件夹,所以我不会创建相同的目标文件,因为我运行concat。

1 个答案:

答案 0 :(得分:3)

永远记住Gruntfiles是javascript:)

grunt.initConfig({
  concat: {
    dependencies: {
      files: (function() {
        var files = Object.create(null);
        grunt.file.expand({filter: 'isDirectory'}, '*').forEach(function(dir) {
          files[dir + '/js/plugins.min.js'] = [
            dir + '/js/vendor/**/*.min.js',
            '!' + dir + '/js/vendor/modernizr/*.js',
            '!' + dir + '/js/vendor/jquery/*.js'
          ];
        });
        return files;
      }()),
    },
  },
});

但是如果您的依赖项处理逻辑很复杂,您可能需要考虑使用诸如browserify或requirejs之类的模块加载器。 concat任务实际上只是将简单文件连接在一起。