Почему я должен сохранить исходный файл LESS дважды, прежде чем Gulp/Vinyl-ftp загрузит файл bootstrap.min.css?
У меня есть gulpfile.js с содержанием ниже. Я хочу, чтобы он создал bootstrap.min.css и загрузил его на сервер, как только я сохраню файл LESS в папке /less. Проблема в том, что только после двойного сохранения файла будет загружен конечный результат. Я думаю, что я делаю что-то не так.
Вот код, который я использую:
var gulp = require ('gulp'),
//cleanCSS = require('gulp-clean-css'),
autoprefixer = require('gulp-autoprefixer'),
less = require('gulp-less'),
plumber = require('gulp-plumber'),
sourcemaps = require('gulp-sourcemaps'),
rename = require('gulp-rename'),
gutil = require('gulp-util'),
ftp = require ('vinyl-ftp');
// Styles Task using LESS
// Uglifies
gulp.task('less', function(){
gulp.src('../less/bootstrap.less')
.pipe(plumber())
.pipe(less())
.pipe(autoprefixer({}))
.pipe(sourcemaps.init())
.pipe(rename({suffix: '.min'}))
.pipe(sourcemaps.write('.'))
.pipe(gulp.dest('../css/'));
});
// Vinyl FTP
gulp.task( 'deploy', function () {
var conn = ftp.create( {
host: '[ftp-address]',
user: '[ftp-user]',
password: '[password]',
parallel: 10,
log: gutil.log
} );
var globs = ['../css/bootstrap.min.css'];
return gulp.src( globs, { base: '.', buffer: false } )
.pipe( conn.newer( '/public_html/[folder/on/server]/css/' ) ) // only upload newer files
.pipe( conn.dest( '/public_html/[folder/on/server]/css/' ) );
} );
// Watch Task
// Watches JS
gulp.task('watch', function(){
gulp.watch('../less/**/*.less', ['less','deploy']);
});
gulp.task ('default', ['less','deploy','watch']);
Так как я не эксперт по javascript / npm / gulp / node.js, я в растерянности. Меня беспокоит, что мне нужно сохранить менее файл дважды. Кто-нибудь может определить ошибку? Если вам нужна дополнительная информация, пожалуйста, не стесняйтесь спрашивать.
Thanx,
Thom
1 ответ
Решение
У вас есть две возможные проблемы:
- Поместите возврат в ваше "менее" задание, чтобы глоток знал, что он закончился.
- Вы не можете предполагать в своей задаче 'watch', что ['less', 'deploy'] запускается / завершается в любом конкретном порядке. Они запускаются параллельно, поэтому порядок может отличаться. То же самое с задачей "по умолчанию".
Лучше сделать свою задачу развертывания зависимой от задачи "меньше"
gulp.task( 'deploy', ['less'], function () {
и изменить на
gulp.watch('../less/**/*.less', ['deploy']);
// Styles Task using LESS
// Uglifies
gulp.task('less', function(){
// add the return to the next line
return gulp.src('../less/bootstrap.less')
.pipe(plumber())
.pipe(less())
.pipe(autoprefixer({}))
.pipe(sourcemaps.init())
.pipe(rename({suffix: '.min'}))
.pipe(sourcemaps.write('.'))
.pipe(gulp.dest('../css/'));
});
// Watch Task
// Watches JS
gulp.task('watch', function(){
gulp.watch('../less/**/*.less', ['deploy']);
});
// Vinyl FTP
gulp.task( 'deploy', ['less'], function () {
var conn = ftp.create( {
host: '[ftp-address]',
user: '[ftp-user]',
password: '[password]',
parallel: 10,
log: gutil.log
} );
var globs = ['../css/bootstrap.min.css'];
return gulp.src( globs, { base: '.', buffer: false } )
.pipe( conn.newer( '/public_html/[folder/on/server]/css/' ) ) // only upload newer files
.pipe( conn.dest( '/public_html/[folder/on/server]/css/' ) );
} );