grunt任务等待以前的任务完成?

时间:2013-11-07 21:42:13

标签: gruntjs

当我在结束时调用shell:clean时,它似乎在~/tmp/<domain>任务完成之前删除了shell:sync目录。我丢失了目的地~/www/versions/<domain>中的文件。

shell:sync任务执行rsync命令将文件从~/tmp复制到~/www

grunt.registerTask('deploy', 'Deploy web app', function(){
    grunt.task.run('shell:create_temp');

    //create version directories
    grunt.task.run('shell:create_version');
    grunt.task.run('shell:sync');

    //create symlink to live site
    grunt.task.run('shell:symlink');
    grunt.task.run('shell:clean');
});

这是配置:

grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        cfg: _.extend(grunt.file.readJSON('config.json'), grunt.file.readJSON('config.'+env+'.json'), { env: env }),
        version_path: '<%= cfg.www_dir %>/versions/<%= cfg.domain %>@<%= pkg.version %>',
        tmp_site_path: '<%= cfg.tmp_dir %>/<%= cfg.domain %>',
        live_path: '<%= cfg.www_dir %>/<%= cfg.domain %>',
        shell: {
            create_temp: {
                command: 'mkdir -p <%= tmp_site_path %>',
                options: {
                    stdout: true,
                    stderr: true
                }
            },
            create_version: {
                command: 'mkdir -p <%= version_path %>',
                options: {
                    stdout: true,
                    stderr: true
                }
            },
            sync: {
                command: 'rsync -avz --delete --progress <%= tmp_site_path %>/ <%= version_path %>/',
                options: {
                    stdout: true,
                    stderr: true
                }
            },
            symlink: {
                command: 'rm <%= live_path %>; ln -sv <%= version_path %> <%= live_path %>',
                options: {
                    stdout: true,
                    stderr: true
                }
            },
            clean: {
                command: 'rm -rf <%= tmp_site_path %>',
                options: {
                    stdout: true,
                    stderr: true
                }
            }
        }
    });

2 个答案:

答案 0 :(得分:2)

通常任务同步运行。但是一个插件可以绕过这个 - 这也可能是插件中的一个错误。

但请注意,您通常会以这种方式结合使用:

grunt.registerTask("deploy", [
    'shell:create_temp',
    'shell:create_version',
    'shell:sync',
    'shell:symlink',
    'shell:clean'
]);

答案 1 :(得分:0)

您可能想查看grunt-bg-shell。它允许您指定任务完成运行时的回调。

bgShell: {
  sync: {
    cmd: 'rsync -avz --delete --progress <%= tmp_site_path %>/ <%= version_path %>/',
    done: function () {
      grunt.task.run('shell:clean');
    }
  }
}