gulp.watch()不使用ftp update

时间:2014-07-27 09:52:53

标签: javascript ftp gulp browserify gulp-watch

我最近学习了gulp并在我的本地计算机上编写了这个gulp脚本,以便它可以监视任何更改,并将我的javascripts(在这种情况下,./js/main.js及其依赖项)编译成一个文件{ {1}}:

./js/bundle.js

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

换句话说,我想远程编码并通过ftp更新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']); ,并且需要知道更改并自动浏览它。

问题是:Gulp识别出更改并登录控制台:

./js/main.js

但是输出文件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); }); 解雇&#39;更改&#39; ftp传输完成后的事件?如果没有,那么它至少应该使用旧版本吗?

谢谢。

2 个答案:

答案 0 :(得分:2)

乍一看,我认为这种行为主要是由于FTP Protocol的运作方式。

事实是,在每种转移模式StreamBlockCompressed中,并非所有数据都是一次发送的。您的所有转移都会被分成小块数据,实际上是8 bits byte size。这就是FTP clients可以确定转移进度的方式,方法是将成功转移的packets与要转移的文件的实际packets数进行比较。

所有这一切都表示当您启动uploadmain.js文件时,client开始传输数据(默认情况下使用Stream模式,顾名思义,stream bytes(嘿!就像gulp!)),在大多数情况下发送STOR命令,创建一个文件服务器如果不存在或以其他方式替换其所有内容。

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

timeout帮助等到文件上传完成,顺便说一句1 second现在有效,但对我来说似乎有点短,特别是如果你有连接不良或文件大小会扩大。

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

答案 1 :(得分:0)

我有同样的问题。我没有使用gulp-watch,而是使用Python库when-changed。它监视目录中的文件更改,但它似乎与gulp没有相同的FTP上传问题。

我删除了gulpfile的监视部分,现在使用以下命令运行'watch'部分:

when-changed -r /var/www/website/css/internal /var/www/website/js/internal -c gulp