我最近学习了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传输完成后的事件?如果没有,那么它至少应该使用旧版本吗?
谢谢。
答案 0 :(得分:2)
乍一看,我认为这种行为主要是由于FTP Protocol
的运作方式。
事实是,在每种转移模式Stream
,Block
或Compressed
中,并非所有数据都是一次发送的。您的所有转移都会被分成小块数据,实际上是8 bits
byte size
。这就是FTP clients
可以确定转移进度的方式,方法是将成功转移的packets
与要转移的文件的实际packets
数进行比较。
所有这一切都表示当您启动upload
个main.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