grunt-contrib-watch + grunt-rsync

时间:2013-12-06 23:31:02

标签: gruntjs rsync grunt-contrib-watch

我正在尝试使用grunt-contrib-watchgrunt-rsync将任何文件更改上传到我的开发服务器。这是我的设置:

var path = require('path');

module.exports = function(grunt) {
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),

        ...

        watch: {
            upload: {
                files: ['*'],
            },
            ...
        },

        rsync: {
            options: {
                args: ['--verbose'],
                exclude: ['.*','node_modules','sql','artifacts','session','logs','cache'],
                recursive: true,
                syncDestIgnoreExcl: true
            },
            dev: {
                options: {
                    src: './',
                    dest: '/usr/local/project',
                    host: 'dev3',
                }
            }
        },
    });

    grunt.event.on('watch', function(action, filepath, target) {
        if(target!=='upload') return;
        grunt.config('rsync.dev.options.src', filepath);
        grunt.task.run('rsync:dev');
    });

    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.loadNpmTasks('grunt-rsync');
    ...
};

rsync任务本身很有用;它可以相对快速地上传我的整个项目,但速度不够快,无法在每个文件编辑中运行。

我正在尝试使用grunt.event.on在再次运行任务之前修改src,以便它只上传一个文件。但是,grunt.task.run('rsync:dev')似乎根本没有做任何事情。没有错误,没有。这是我运行它然后创建一个新文件时的输出:

$ grunt watch:upload --debug --stack
Running "watch:upload" (watch) task
Waiting...OK
>> File "ppp" added.

如果我给它一个无效的任务名称,它会输出错误,所以它显然正在寻找任务,我只是不确定它正在做什么。该文件永远不会到达我的服务器。

如何才能将rsync保存到我保存的文件中?

N.B。 newer似乎也不起作用,因此我尝试通过grunt.event.on('watch'手动执行此操作

2 个答案:

答案 0 :(得分:2)

建议不要在watch事件中运行任务。请在此处查看警告:https://github.com/gruntjs/grunt-contrib-watch#using-the-watch-event

目前,执行上述操作的最佳方法是使用watch事件配置rsync任务,但使用watch tasks运行任务,如下所示:

grunt.initConfig({
  watch: {
    upload: {
      // Dont spawn to retain the process context here
      options: { spawn: false },
      files: ['*'],
      tasks: ['rsync:dev']
    },
  },
});
grunt.event.on('watch', function(action, filepath, target) {
  if (target === 'upload') grunt.config('rsync.dev.options.src', filepath);
});

FWIW,我们正在寻找更好的方法来处理上述用例。以下是主要想法:https://github.com/gruntjs/grunt-contrib-watch/issues/156

答案 1 :(得分:2)

即使使用Kyle's solutiongrunt-contrib-watch也太慢了(至少在linux上)。我找到了另一个库grunt-este-watch,它运行得更快,并允许您在每次更改之前更新rsync配置,而不会有任何hackery。我的设置现在看起来像这样:

esteWatch: {
    options: {
        dirs: [
            '**/',
            '!node_modules/**/',
            '!sql/**/',
            '!artifacts/**/',
            '!session/**/',
            '!logs/**/',
            '!cache/**/',
            '!plugins/ezc/**/',
        ],
        livereload: {
            enabled: true,
            port: 35729,
            extensions: ['css'],
        }
    },
    '*': function(filepath) {
        if(grunt.file.isMatch(['**/*___jb*'],filepath)) return []; // ignore temporary JetBrains files
        var tasks = ['rsync'];
        if(grunt.file.isMatch(grunt.config('uglify.dist.src'),filepath)) tasks.push('uglify');
        if(grunt.file.isMatch(grunt.config('less.dist.src'),filepath)) tasks.push('less');
        grunt.config('rsync.dev.options.src', filepath);
        grunt.config('rsync.dev.options.dest', path.join('/path/to/project',filepath));
        return tasks;
    }
},