Gruntjs:如何根据目录创建连接文件的任务

时间:2013-05-04 23:32:36

标签: templates underscore.js gruntjs

我已经使用gruntjs和grunt-contrib-jst编写了一个任务来预编译我的所有模板文件(存储在“coffee”文件夹中)并将它们连接在一个单独的javascript文件AppTemplate.js中。

    jst: {
        compile: {
            options: {
              templateSettings: {
                "variable" : "data"
              },
              prettify: true,
              processName: function(filename) {
                return name = filename.replace('coffee/','');
              }
            },
            files: {
                "js/AppTemplates.js": ["coffee/**/*.html"]
            }
        }
    },

到目前为止,一切都运行良好,无论如何,因为模板的数量正在增长,我想将模板拆分为按其所属模块分组的独立文件。

我的文件夹结构如下:

|--modules
  |--user
    |--templates
      * html template files *
    user_module.coffee
  |--post
    |--templates
      * html template files *
    post_module.coffee

依旧......

我只是想在每个模板文件夹中创建一个template.js文件,但我不知道如何编辑我的原始任务来实现它。任何帮助或提示表示赞赏,谢谢!

1 个答案:

答案 0 :(得分:2)

您可以直接定义每个目录 - 例如:

files: { 
    'public/js/allfiles.js': [ 'public/js/*.js' ],
    'public/js/lib/allfiles.js': [ 'public/js/lib/*.js' ] 
}

或者您可以做一些更动态的事情,以便自动拾取每个新模块目录。

例如:

module.exports = function( grunt ) {
    "use strict";
    var util = require('util');
    var path = require('path');

    grunt.initConfig({
        pkg: grunt.file.readJSON("package.json"),
        buildFiles: {},
        concat: {
            options: {
                separator: ';'
            },
            dist: {
                files: '<%= buildFiles %>'
            }
        },
    });

    grunt.loadNpmTasks('grunt-contrib-concat');

    grunt.registerTask('default', ['buildList', 'concat']);

    grunt.registerTask('buildList', function() {
        var dirs = grunt.file.expand({filter: 'isDirectory'}, ['./public/js/**']);

        var files = grunt.config.data.buildFiles;
        dirs.forEach(function(val) {
            files[path.join(val, 'allfiles.js')] = [path.join(val, '*.js')];
        });
    });
};

此代码基本上只构建与初始选项相同的静态配置。

输出:

Running "buildList" task

Running "concat:dist" (concat) task
File "public/js/allfiles.js" created.
File "public/js/lib/allfiles.js" created.

注意:可能有更好的方法来使用grunts各种文件apis来执行此操作...