GruntJS,多任务和grunt.option

Mik*_*ike 4 javascript node.js gruntjs

我开始在我的一个项目中使用GruntJS.我很容易完成使用简单别名编写一个简单的构建脚本.

但是我的脚本包含许多基本相同的任务,唯一的区别是一些参数,如源文件夹和目标文件夹.

例如:

    sass: {
        options:{
            trace: true,
            debugInfo: true,
            style: 'compressed'
        },
        html: {
            files: {
                'build/html/css/main.css': 'sass/html.sass'
            }
        },
        html2: {
            files: {
                'build/html2/css/main.css': 'sass/html2.sass'
            }
        },
        html3: {
            files: {
                'build/html3/css/main.css': 'sass/html3.sass'
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我想要实现的是只有一个任务,然后将参数(dest,src)传递给该任务.

我尝试使用MultiTasks实现这个:

grunt.registerTask('sass2', 'Run all Sass compilation tasks.', function() {
    var projects = ['html','html2','html3'];

    projects.forEach(function(proj){
        grunt.config.set('sass.files.dest', 'build/' + proj + '/css/main.css');
        grunt.config.set('sass.files.src', 'sass/' + proj + '.sass');
        grunt.log.writeln(grunt.config.get('sass.files.dest'));
        grunt.log.writeln(grunt.config.get('sass.files.src'));
        grunt.task.run('sass');

    });
});
Run Code Online (Sandbox Code Playgroud)

Grunt日志输出params的正确值,但只有html3 sass被编译.

我不明白为什么只有一个项目被编译,我怎么能解决这个问题.

也许还有另一种方法可以解决这个问题.一个更好的方法.也许使用模板?

任何形式的帮助或提示将不胜感激.

谢谢!

exp*_*nit 6

仅使用最后一个配置,因为grunt.task.run将它们排队以当前任务完成运行.来自API:

将一个或多个任务排入队列.taskList中的每个指定任务都将在当前任务完成后立即按指定的顺序运行

你有的是:

  • 设置配置1
  • 设置配置2
  • 设置配置3
  • 使用当前活动的配置(#3)运行三个任务.

相反,您可以执行类似的操作来动态创建大量配置节,然后运行这些任务:

grunt.config.set('sass.' + proj + '.files', [{
    src: 'sass/' + proj + '.sass',
    dest: 'build/' + proj + '/css/main.css'
}]);
Run Code Online (Sandbox Code Playgroud)

然后使用新创建的部分调用runtask:

grunt.task.run('sass:' + proj);
Run Code Online (Sandbox Code Playgroud)