Используя grunt concat, как я могу автоматизировать конкатенацию одного и того же файла во многие другие файлы? - программирование
Подтвердить что ты не робот

Используя grunt concat, как я могу автоматизировать конкатенацию одного и того же файла во многие другие файлы?

Чтобы объединить два файла, он выглядит примерно так:

  concat: {
    src: ['common.js','js/app.js'],
    dest: 'assets/js/app.js'
  }

И если я хочу объединить целую папку файлов в одну, она выглядит примерно так:

  concat: {
    src: ['dev/*.js','],
    dest: 'prod/js/app.js'
  }

Но скажем, у меня есть файл, который я хочу выполнить на 10 или 20 других файлах, и я хочу, чтобы они разделились отдельно? Другими словами, вот что я ищу:

A.js + B.js = AB.js
A.js + C.js = AC.js
A.js + D.js = AD.js
A.js + E.js = AE.js

И так далее... Чтобы быть более конкретным, тем не менее, я могу понять, как конкат файлы один за другим, как описано, но я хочу выяснить, как указать A.js из примера, и попросить его выполнить любой файл по указанному пути. Поэтому я хочу:

A.js + dev/*.js = AB.js, AC.js, AD.js, AE.js ...

В псевдокоде вот что я хочу:

  concat: {
    src: ['common.js', 'dev/*.js','], // common.js gets concatenated to each file in this directory
    dest: 'prod/js/*.js' // each file in src gets saved separately in dest 
  }

Буду признателен за любую помощь, мне сложно найти информацию о том, как это сделать

4b9b3361

Ответ 1

Grunt встроенная concat задача (я рекомендую посмотреть исходный код) не поддерживает ничего, как dest: 'prod/js/*.js', вам нужно будет указать каждый вывод целевой отдельно, что является излишним в вашем случае.

Лучше всего просто написать свой собственный код (возможно, обернуть его в пользовательскую задачу), это довольно просто. Вот простая многозадачная упаковка. Не обещайте надежного и безопасного использования:)

  grunt.registerMultiTask('wrap', 'Wraps source files with specified header and footer', function() {
        var data = this.data,
            path = require('path'),
            dest = grunt.template.process(data.dest),
            files = grunt.file.expandFiles(this.file.src),
            header = grunt.file.read(grunt.template.process(data.header)),
            footer = grunt.file.read(grunt.template.process(data.footer)),
            sep = grunt.utils.linefeed; 

        files.forEach(function(f) {
            var p = dest + '/' + path.basename(f),
                contents = grunt.file.read(f);

            grunt.file.write(p, header + sep + contents + sep + footer);
            grunt.log.writeln('File "' + p + '" created.');
        });
  });

Загрузите его с помощью такой конфигурации:

wrap: {
    html: {
        header: '<%= project.partials %>/head.html',
        footer: '<%= project.partials %>/footer.html',
        src: [
            '<%= project.pages %>/index.html',
            '<%= project.pages %>/about.html',
            '<%= project.pages %>/blog.html'
        ],
        dest: '.'   // destination *directory*, probably better than specifying same file names twice
    }
}

На всякий случай я также обновил вашу скрипку: http://jsfiddle.net/dipish/hKkGX/