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
工作原理。
事实是,在每种传输模式下, Stream
, Block
或Compressed
,并不是所有的数据都是一次发送的。 所有传输都被分割成小块数据,实际上是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