Как настроить автоматическую атомную передачу по SFTP
Я работаю над личным проектом. Поскольку мне не нужно беспокоиться о работе с другими или развертывании из среды разработки в производственную среду, я просто изменяю файлы на сервере, на котором я обслуживаю свое приложение.
Для этого я использую Transmit от Panic ( https://panic.com/transmit/), клиент FTP/SFTP. К счастью для меня, он предлагает возможности FUSE, поэтому я могу смонтировать файловую систему моего сервера на мою локальную файловую систему. Я делаю изменения в своем текстовом редакторе, они сохраняются, они загружаются автоматически.
Но мои файлы также должны быть обработаны Gulp ( http://gulpjs.com/) на сервере. Эта часть также работает. Gulp просматривает файлы и, если они меняются, обрабатывает их.
К сожалению, эти две вещи плохо работают вместе. Когда я делаю изменение, я получаю пустой файл, в котором я ожидаю, что будет только что обработанный файл.
Моя гипотеза состоит в том, что Transmit не передает мои файлы атомарно. И это, кажется, не дает возможности сделать это. Gulp видит изменения файлов до того, как Transmit сможет загрузить их содержимое, поэтому я получаю пустые файлы.
У меня вопрос, что я могу сделать, чтобы справиться с этим? Я бы предпочел оставаться как можно ближе к моей нынешней цепочке инструментов, но я также открыт для совершенно новых способов достижения этой цели.
Спасибо!
1 ответ
Оказывается, что атомарность при передаче файлов могла быть только половиной проблемы. То есть одна вещь, которую я сделал перед публикацией здесь, состояла в том, чтобы убедиться, что мой текстовый редактор был атомарным. Не было, но проблема сохранялась даже после того, как я это исправил.
Другая половина была правами доступа к файлам. Gulp создавал файл с слишком ограниченными правами доступа. Это было исправлено моим gulp-chmod ( https://www.npmjs.com/package/gulp-chmod). Вот то, что моя работа gulpfile.js
похоже:
var gulp = require('gulp');
var $ = require('gulp-load-plugins')();
var sassPaths = [
'bower_components/normalize.scss/sass',
'bower_components/foundation-sites/scss',
'bower_components/motion-ui/src'
];
gulp.task('sass', function() {
return gulp.src('scss/styles.scss')
.pipe($.sass({
includePaths: sassPaths,
outputStyle: 'nested'
})
.on('error', $.sass.logError))
.pipe($.autoprefixer({
browsers: ['last 2 versions', 'ie >= 9']
}))
.pipe($.chmod(0o644))
.pipe(gulp.dest('static/css'));
});
gulp.task('default', ['sass'], function() {
gulp.watch(['scss/**/*.scss'], ['sass']);
});