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 внутри каждой папки шаблонов, но я не знаю, как отредактировать исходную задачу для этого. Любая помощь или советы приветствуются, спасибо!


person Ingro    schedule 04.05.2013    source источник


Ответы (1)


Вы можете определить каждый каталог напрямую - что-то вроде:

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.

Примечание: для этого могут быть лучшие способы использовать ворчание различных файловых API...

person dc5    schedule 05.05.2013
comment
Спасибо, это то, что мне было нужно! :) - person Ingro; 06.05.2013