JoshuaPrior
JoshuaPrior

Reputation: 21

Grunt: How to build the files object dynamically

I must be missing something very simple here. I'm trying to write a function task that deals with files. The Grunt API docs mention that you can [Build the files object dynamically], but for some reason I can't get this to work. A simplified version of my Gruntfile.js file looks like this:

module.exports = function(grunt) {
    grunt.initConfig({
        proj: {
            build: {
                files: [{
                    expand: true,
                    cwd: 'src',
                    src: ['**/*.js'],
                    dest: 'dist'
                }]
            }
        }
    });

    grunt.registerTask('proj', function(){
        var files = grunt.config('proj.build.files');
        console.log(files);
    });
};

I expect the log to show a list of file mappings from the src directory to the dist directory. What actually gets logged is the object proj.build.files from the config, like this:

Running "proj:build" task
[ { expand: true, cwd: 'src', src: [ '**/*.js' ], dest: 'dist' } ]

Done, without errors.

The API docs only talk about this type of configuration in terms of other tasks. I tried looking through the uglify task to see how the file mappings are retrieved, but I couldn't figure it out.

Upvotes: 2

Views: 1359

Answers (2)

Jason
Jason

Reputation: 1

You can use rename function to change file name is files object like below...

build: {
  files: [{
    expand: true,
    cwd: 'src',
    src: ['**/*.js'],
    dest: 'dist',
    rename: function(dest, src) {
      /* 
         rename logic
         you will have access to src and dest name and can return desirect name from this function.
      */
      return src+123;
    }
 }]
}

Upvotes: 0

almeidap
almeidap

Reputation: 256

Here is the workaround I found to dynamically build filesets for Grunt tasks:

uglify: {
    app: {
        files: [{
            src: '{<%= _prefixSrc(pkg.target, pkg.resources.js) %>}', // Note the brackets!
            dest: '<%= pkg.target %>min/<%= pkg.name %>.min.js'
        }]
    }
},
_prefixSrc: function(prefix, files) {
    return files.map(function(file){
        return prefix + file;
    });
},

See also this issue/feature request on GitHub and feel free to comment it if you find it useful: https://github.com/gruntjs/grunt/issues/1307

Upvotes: 1

Related Questions