4

我最近学习了 gulp 并在我的本地计算机上编写了这个 gulp 脚本,以便它可以监视任何更改,并将我的 javascripts(在这种情况下,./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 更新并浏览它们。

换句话说,我想远程编码并./js/main.js通过 ftp 更新,并让 gulp 监视更改并自动浏览它。

问题是: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);

});

然后代码运行正常。

我想问一下为什么它必须等待一段时间才能进行浏览。gulp.watch()ftp 传输完成后不应该触发“更改”事件吗?如果没有,至少不应该使用旧版本吗?

谢谢你。

4

2 回答 2

2

乍一看,我认为这种行为主要取决于FTP Protocol工作方式。

事实是,在每种传输模式中StreamBlockCompressed,并非所有数据都一次发送。您的所有传输都被切成小块数据,实际上8 bitsbyte size. FTP clients通过比较packets成功传输的文件数量与packets您要传输的文件的实际数量,这就是确定传输进度的方法。

所有这一切都说明当您启动upload文件main.js时,client开始传输数据(默认使用Stream模式,顾名思义,a streamof bytes(Hey ! Just as gulp!)),在大多数情况下发送该STOR命令,如果文件不存在则在服务器上创建一个文件,否则替换其所有内容。

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

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

您可以查看RFC 959了解更多详细信息,这是FTP Protocol.

于 2014-07-27T21:34:02.013 回答
0

我遇到过同样的问题。而不是使用 gulp-watch 我现在使用 Python 库when-changed。它监视目录中的文件更改,但它似乎没有像 gulp 那样对 FTP 上传有同样的问题。

我已经删除了 gulpfile 的 watch 部分,现在正在使用以下命令运行“watch”部分:

when-changed -r /var/www/website/css/internal /var/www/website/js/internal -c gulp
于 2015-05-17T10:33:55.663 回答