gulp.watch()不能用于ftp更新

我最近学习了gulp并在本地计算机上编写了这个gulp脚本,以便它可以监视任何更改,并将我的javascript(在本例中为./js/main.js及其依赖项)编译为单个文件./js/bundle.js

var gulp = require('gulp');
// Plugins
var jshint = require('gulp-jshint');
var browserify = require('gulp-browserify');
var rename = require('gulp-rename');

// Lint Task
gulp.task('lint', function() {
  return gulp.src(['./js/**/*.js', '!./js/bundle.js'])
    .pipe(jshint())
    .pipe(jshint.reporter('default'));
});

// browserify task
gulp.task('b', function() {
  gulp.src('js/main.js')
    .pipe(browserify())
    .pipe(rename('bundle.js'))
    .pipe(gulp.dest('js/'));

});

// Watch Files For Changes
gulp.task('watch', function() {
  gulp.watch(['./js/*.js', './js/**/*.js', '!./js/bundle.js'], ['lint', 'b'])
    .on('change', function(event) {
      console.log("n============");
      console.log('File ' + event.path + ' was ' + event.type + ', running tasks...');
    });
});

// Default Task
gulp.task('default', ['lint', 'watch']);

它在我的本地计算机(Windows 7)上运行良好,所以我尝试将它放到远程Ubuntu服务器上,并让它监视任何ftp更新并对它们进行浏览。

换句话说,我想远程编写代码并通过ftp更新./js/main.js ,并且对这些变化进行./js/main.js观察并自动对其进行浏览。

问题是:Gulp认识到更改并登录到控制台上:

File /home/wordpress/public_html/cm/mobileCoder02/src/js/main.js was changed, running tasks...
[09:27:47] Starting 'lint'...
[09:27:47] Starting 'b'...
[09:27:47] Finished 'b' after 34 μs
[09:27:47] Finished 'lint' after 6.71 ms

但是输出文件bundle.js包含模块加载器脚本:

(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){

},{}]},{},[1])

如果我将任务更改为

// browserify task
gulp.task('b', function() {
  setTimeout(function() {
    gulp.src('js/main.js')
      .pipe(browserify())
      .pipe(rename('bundle.js'))
      .pipe(gulp.dest('js/'));
  }, 1000);

});

然后代码运行OK。

我想问问为什么在浏览之前必须等待一段时间。 在ftp传输完成后, gulp.watch()应该发射'change'事件吗? 如果不是,它不应该至少使用旧版本吗?

谢谢。


乍一看,我认为这种行为主要是由于FTP Protocol工作原理。

事实是,在每种传输模式下, StreamBlockCompressed ,并不是所有的数据都是一次发送的。 所有传输都被分割成小块数据,实际上是8 bits byte size 。 这是怎样FTP clients可以决定一个传送的进展,通过比较多少packets与实际数量已成功传输packets要传输的文件组成。

所有这一切都表明,当你开始upload你的main.js文件时, client开始传输数据(默认情况下使用Stream模式,正如其名字所暗示的那样,是stream bytes stream (嘿!就像gulp ! )),在大多数情况下发送STOR命令,在服务器上创建一个文件(如果该文件不存在或者以其他方式替换它的所有内容)。

由于每次文件更改都会触发gulp watcher器,即使文件没有上传,成功传输数据包的单个刻度也可以启动您的任务。 就像我说的那样,当文件已经存在于服务器上时,它的所有内容都会在数据传输之前被清理干净,因此您的task将以空文件或部分文件运行。

您的timeout有助于在此等待文件完成上传 ,顺便说1 second ,但对我来说似乎有点短,特别是如果您的连接不好或文件大小会扩大。

您可以查看RFC 959了解更多详细信息,这是FTP Protocol的当前标准规范。


我遇到过同样的问题。 现在我正在使用Python库进行更改,而不是使用gulp-watch。 它监视一个目录中的文件更改,但它似乎没有与吞噬FTP一样的FTP上传问题。

我已经删除了我的gulp文件的手表部分,现在使用以下命令运行'watch'部分:

when-changed -r /var/www/website/css/internal /var/www/website/js/internal -c gulp
链接地址: http://www.djcxy.com/p/32901.html

上一篇: gulp.watch() not working with ftp update

下一篇: Mixing browserify and webpack externals