Grunt循环执行copy任务仅复制最后一个文件的问题求助
问题分析与解决方案
这是Grunt任务队列机制导致的典型问题——你在循环中调用grunt.task.run('copy:core')时,并没有立即执行copy任务,只是把任务添加到了执行队列里。当你的moveCore函数执行完所有循环后,Grunt才会开始处理队列中的任务。而循环里的grunt.option()设置是同步覆盖的,所有待执行的copy:core任务最终都会读取循环最后一次设置的coreName和coreNumber值(也就是header和1),这就是为什么只有最后一个模块的文件被复制了。
解决方案1:动态生成独立的Copy子任务
为每个模块创建专属的copy子任务,避免选项值被覆盖:
function moveCoreFiles() { var models = require('./variables.json'); var cores = models.config.modules; cores.forEach(function(core) { // 为每个模块生成唯一的任务名 var uniqueTaskName = 'copy:core_' + core.name; // 动态配置这个子任务的参数 grunt.config.set(uniqueTaskName, { files: [{ expand: true, cwd: `core/${core.name}/${core.number}/`, src: '**', dest: '../sass/2_deploy/core/' }] }); // 将该子任务加入执行队列 grunt.task.run(uniqueTaskName); grunt.log.write(core.name); }); } grunt.registerTask('moveCore', moveCoreFiles);
这种方式每个模块的复制任务是独立的,你能在日志里看到每个任务的执行详情,排查问题更方便。
解决方案2:一次性构建所有复制规则,执行一次Copy任务
如果不需要单独的任务日志,这种方式更高效——直接把所有模块的复制规则整合到一个copy任务里:
function moveCoreFiles() { var models = require('./variables.json'); var cores = models.config.modules; // 生成所有需要复制的文件规则数组 var copyFiles = cores.map(function(core) { return { expand: true, cwd: `core/${core.name}/${core.number}/`, src: '**', dest: '../sass/2_deploy/core/' }; }); // 更新copy:core的files配置 grunt.config.set('copy.core.files', copyFiles); // 只需要执行一次copy任务 grunt.task.run('copy:core'); cores.forEach(function(core) { grunt.log.write(core.name); }); } grunt.registerTask('moveCore', moveCoreFiles);
这种方式Grunt只需要启动一次copy任务,处理所有复制操作,性能更优。
内容的提问来源于stack exchange,提问作者luanmessias
相关产品推荐
相关产品推荐

