2015-12-07 1 views
0

J'écris grunt pour concaténer des fichiers dynamiquement, pour cela j'ai un tableau de fichiers dans ma variable grunt.config. Comment utiliser cela dans la concaténation grunt.Grunt Task Runner pour concaténer des fichiers

J'écris grunt.config('jsResources', targetConfig); à partir de la fonction de remplacement de texte dynamiquement. Son retour en tableau. Comment l'utiliser dans la concaténation grunt. J'ai essayé de cette façon mais ce n'est pas la peine.

Mon jsResources est un tableau. Mon grunt est comme

concat: { 
    js: { 
     //Concatenate all of the files in the jsResources configuration property 
     src: ['app/<%= jsResources %>'], 
     dest: 'build/views/js/combined.js', 
     options: { 
      separator: ';\n' 
     } 
    }    
} 

Sa teneur en repalcing mais ne peut pas lire le contenu, et concaténer dans mes combine.js Mes « jsResources » est comme ['scripts/modules/allModules.js','scripts/config/constants.js','...'] Sa création d'un fichier vide combine.js.

Répondre

2

Alors je lui ai donné un essai plus et c'est résultat:

Vous devez générer des chemins avant de les mettre dans la variable basé sur un modèle. La variable modèle ici est un objet mais peut être n'importe quel valide jsmore info. Et à l'intérieur, vous pouvez définir les propriétés qui ont un tableau en tant que valeurs.

module.exports = function(grunt) { 

    var myFiles = { 
    jsResources: ['file1.js', 'file2.js'] 
    }; 

    myFiles.jsResources = myFiles.jsResources.map(function(item) { return 'app/' + item; }); 

    // var jsres = myFiles.jsResources; // another way 

    grunt.initConfig({ 
    // myFiles: myFiles, // this is also possible instead of grunt.config() below 
    concat: { 
     dist: { 
     src: ['<%= myFiles.jsResources %>'], // src: ['<%= jsres %>'], 
     dest: 'dest.js', 
     }, 
     options: { 
     separator: '\n' 
     } 
    } 
    }); 

    grunt.config('myFiles', myFiles); 
    // grunt.config('jsres', jsres); // another way 

    grunt.loadNpmTasks('grunt-contrib-concat'); 
    grunt.registerTask('default', ['concat:dist']); 

}; 

Ceci génère dest.js avec le contenu.

+0

Je pense que l'ajout de 'jsResources' en tant que propriété de l'objet' myFiles' est une complication inutile. Les templates sont évalués par rapport à l'ensemble de l'objet config, donc avoir une propriété de configuration 'jsResources' vous permettra d'écrire' <% = jsResources%> '. –

+0

Correct, peut être n'importe quel '' '' js''' valide. J'ai mis à jour la réponse avec des commentaires. Merci. –

1

La réponse d'Edin est un bon moyen d'y parvenir. Une autre solution consiste à (ab) utiliser les expand/cwd options comme suit:

grunt.initConfig({ 
    jsDir: 'app', 
    jsResources: [ 'one.js', 'two.js' ], 

    concat: { 
    app: { 
     expand: true, 
     cwd: '<%= jsDir %>', 
     src: ['<%= jsResources %>'], 
     dest: 'dest.js', 
     rename: function (dest) { return dest; } 
    } 
    } 
}); 

Notez que expand: true est normalement utilisé pour avoir des correspondances src/dest dynamiques, le plus souvent avec beaucoup de paires src/dest (plutôt qu'un tableau de sources mappées vers une destination unique comme requis par grunt-contrib-concat). Cependant, dans ce cas, il peut être utilisé en conjonction avec l'option rename (brièvement documenté here) pour obtenir ce que vous voulez.

Il s'agit d'une approche hacky, mais elle a l'avantage d'être déclarative (à la Grunt) et permet de configurer le répertoire de travail (comme je l'ai montré plus haut avec jsDir).