2012-10-04 11 views
13

zwei Dateien verketten, sieht es so etwas wie dieses:Mit Grunt concat, wie würde ich die Verkettung der gleichen Datei mit vielen anderen Dateien automatisieren?

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

Und wenn ich einen ganzen Ordner von Dateien in eine verketten wollen, sieht es so etwas wie dieses:

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

Aber lassen Sie uns sagen Ich habe eine Datei, die ich mit 10 oder 20 anderen Dateien verbinden möchte, und ich möchte, dass sie getrennt angezeigt werden. Mit anderen Worten, hier ist was ich suche:

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

Und so weiter ... spezifischere obwohl sein, kann ich herausfinden, wie Dateien nacheinander verketten, wie beschrieben, aber ich mag Finde heraus, wie man A.js aus dem Beispiel spezifiziert, und lasse es in irgendeine Datei in einem spezifizierten Pfad einfließen. Also, was ich will, ist:

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

In Pseudo-Code, hier ist das, was ich will:

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 
    } 

ich Hilfe schätzen würde, ich habe habe eine harte Zeit, Informationen zu finden, wie man Tun Sie dies

+0

Wenn jemand braucht eine ähnliche Sache, dieses Plugin tut genau das https://www.npmjs.org/package/grunt-wrap2000 – Tetaxa

+0

alles, was Sie tun müssen, ist die Banner-und Fußzeilen-Optionen in grunt-contrib-concat verwenden. Wenn Sie eine ganze Datei vorgeben möchten, tun Sie einfach "banner: require ('./ foo.js')". gleich mit Fußzeile. – jonschlinkert

Antwort

19

Grunt's eingebaute concat Aufgabe (Ich empfehle die Quelle btw) unterstützt nichts wie , müssten Sie jedes Ausgabeziel separat angeben, die in Ihrem Fall ein Overkill ist.

Ihre beste Wette ist, nur Ihren eigenen Code zu schreiben (vielleicht wickeln Sie es in Ihre benutzerdefinierte Aufgabe), es ist ziemlich einfach. Hier ist eine einfache Wrap Multitasking. Sie versprechen nicht, es ist robust und sicher :)

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.'); 
     }); 
    }); 

Füttert man mit einer Config wie folgt zu verwenden:

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 
    } 
} 

Nur für den Fall ich auch Ihre Geige aktualisiert: http://jsfiddle.net/dipish/hKkGX/

+0

Um zu verdeutlichen, möchte ich für jede Datei einzeln concat, also kannst du auch dest: 'prod/js/*. Js'? Und danke für deine Antwort! – jonschlinkert

+0

Funktioniert die aktualisierte Antwort für Sie? –

+0

sieht aus wie es sollte, aber ich kann es nicht zur Arbeit bringen. Ich weiß, das ist eine Menge zu fragen, jede Chance, Sie könnten dies in eine Beispiel-Grunt-Datei einfügen? Hier ist ein Jfiddle mit meiner Grunt-Datei - nur zum leichteren Lesen http://jsfiddle.net/rRpeg/ – jonschlinkert