我正在尝试使用grunt-contrib-watch和grunt-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'
手动执行此操作
答案 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 solution,grunt-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;
}
},