Назад | Перейти на главную страницу

Как настроить автоматические атомарные переводы по SFTP

Работаю над личным проектом. Поскольку мне не нужно беспокоиться о работе с другими или развертывании из среды разработки в производственную среду, я просто изменяю файлы на сервере, на котором я обслуживаю свое приложение.

Для этого я использую Panic's Transmit (https://panic.com/transmit/), клиент FTP / SFTP. К счастью для меня, он предлагает возможности FUSE, поэтому я могу смонтировать файловую систему моего сервера в мою локальную файловую систему. Я вношу изменения в текстовом редакторе, они сохраняются и загружаются автоматически.

Но мои файлы также должны обрабатываться Gulp (http://gulpjs.com/) на сервере. Эта часть тоже работает. Gulp наблюдает за файлами и, если они изменяются, обрабатывает их.

К сожалению, эти две вещи не работают вместе. Когда я вношу изменения, я получаю пустой файл, где, как я ожидаю, должен быть только что обработанный файл.

Моя гипотеза заключается в том, что Transmit не передает мои файлы атомарно. И похоже, что он не предлагает такой возможности. Gulp замечает изменения файлов до того, как Transmit сможет загрузить их содержимое, поэтому я получаю пустые файлы.

У меня вопрос, что я могу сделать, чтобы с этим справиться? Я бы предпочел оставаться как можно ближе к моей текущей цепочке инструментов, но я также открыт для совершенно новых способов достижения этой цели.

Спасибо!

Оказывается, атомарность передачи файлов может были только половиной проблемы. То есть, перед тем, как разместить здесь пост, я убедился, что мой текстовый редактор был атомарным. Это не так, но проблема сохранялась даже после того, как я это исправил.

Другая половина - это права доступа к файлам. 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']);
});