• Автоматическое копирование файлов на FTP/SSH в Eclipse

    В последнее время все чаще и чаще слышны просьбы веб-разработчиков сделать удобную работу в любимом редакторе/IDE, чтобы изменившиеся файлы автоматически попадали на удаленный сервер. Самый простой способ решить эту задачу — редактировать файлы напрямую на сервере. Хотя это вполне рабочее решение, у него есть ряд недостатков, самый большой из которых: отсутствие локальной копии файла. В случае, если ваш коллега через 5 минут закачает свою, исправленную и дополненную версию файла, можно быть уверенным, что ваши изменения потеряются безвозвратно. Более того, этот способ годиться только для мелких исправлений, на 5—10 минут. Если же нужно решить какую-то более глобальную задачу, дней на 5, например, вам в любом случает придется держать локальную копию проекта, чтобы спокойно переводить его в нерабочее состояние.

    Самый правильный способ решения задач с синхронизацией файлов, который проповедуют все маститые разработчики — использовать систему версионного контроля (VCS), вроде SVN или Git. Рабочий процесс в этом случае выглядит следующим образом. Разработчик локально, у себя на компьютере, вносит необходимые изменения и делает коммит в репозиторий. В этот момент у репозитория срабатывает хук (некий скрипт), который берет изменившиеся файлы и закачивает на продакшн-сервер. Это идеальное решение для командной работы, когда необходимо объединять свои исправления с чужими. И еще, как бонус: нет необходимости бегать по 10 разным папкам и вручную копировать изменившиеся файлы на сервер. Достаточно нажать всего на одну кнопку — и абсолютно все необходимые файлы оказываются на сервере. Многих, почему-то, пугает такая «сложность», хотя на настройку окружения требуется времени не больше, чем на очередной перекур или чтение новостей.

    Ну ладно, оставим это на совести каждого конкретного человека. Недавно у меня возникла, скажем так, промежуточная задача. Весь проект лежит в SVN, автоматом закачивается на продакшн — все работает просто замечательно. Только сайт написан на Java, и для его локального запуска требуется ой как много ресурсов, особенно если параллельно работает Eclipse, фотошоп и виртуальная машина с виндой. Обычный рефреш страницы занимал минуту. И я озадачился тем, чтобы над проектом можно было работать локально, а вот проверять его можно было на удаленном dev-сервере. То есть я правлю файл, сохраняю его, при необходимости делаю build (объединение и минификация JS и CSS) и все изменившиеся файлы автоматически попадают на dev-сервер, без каких-либо лишних телодвижений. Решение оказалось довольно простым и элегантным, возможно, сработает и для других редакторов и IDE. Итак:

    1. Под *nix системы есть замечательный проект под названием FUSE, который позволяет монтировать удаленный сервер как обычную папку в локальной файловой системе. На Маке я использовал MacFuse + оболочку MacFusion для настройки FTP/SSH-серверов. На винде можно использовать платный WebDrive или NetDrive для этих же целей.
    2. Устанавливаем FUSE или WebDrive/NetDrive, настраиваем подключение к серверу и монтируем его как локальную папку.
    3. Для Eclipse ставим плагин FileSync, задача которого — автоматически синхронизировать проект с какой-нибудь внешней папкой. Синхронизация одностронняя: копируются файлы из проекта в папку, но не из папки в проект.
    4. Идем в настройки проекта (Project → Properties) в секцию File synchronization и настраиваем синхронизацию для проекта (пример с сайта разработчика):

      Настроить синхронизацию можно довольно гибко: можно исключить какие-то папки из синхронизации, можно использовать переменные в путях.

    5. Не забываем включить автобилд (Project → Build Automatically), чтобы при любом изменении ресурсов проекта файлы автоматически синхронизировались, и опцию General → Workspace → Refresh automatically в настройках Eclipse, чтобы файлы, добавленные вне Eclipse (например, картинку новую скопировали) автоматически появлялись в проекте.

    Все, теперь можно спокойно и без лишних телодвижений локально редактировать проект и тут же проверять его на удаленном сервере.

    UPD: Решение от Neolord для работы со стандартным синхронизатором из Aptana.

  • 20 комментариев

    1. zantor
      1 октября 2009

      >>> На винде можно использовать платный WebDrive или NetDrive для этих же целей.
      А чем Samba плохо? На dev-сервере самба, в винде присоединил сетевой диск — вуаля, все готово

    2. Сергей Чикуенок
      1 октября 2009

      Можно и Самбу поставить. Только, чую, не каждый админ захочет с ней возиться ради этого :)

    3. Neolord
      1 октября 2009

      Могу предложить чуть более простое решение для тех, у кого стоит Аптана как плагин.
      В ней есть вьюшка Scripts, в котором есть Syncronize->Upload on Save
      После некоторого допиливания (http://demos.uskoff.com/eclipse_autoupload/upload.js) надо этот файлик положить в папку scripts в любом проекте и сохранить. Саму папку можно клоакнуть и исклоючить из списка синхронизации чтобы не создавать лишних файлов на сервере. Затем нужному проекту настраивается Synchronization Connection средствами Аптаны (там поддерживается и фтп, и сфтп, и даже SVN), и вуаля. При нажатии Ctrl+S файл в любом проекте сам зальется на сервер.

      При этом сохраняются все плюшки локального проекта вроде Outline. А вот Create Remote Project через Remote System Explorer, который по идее должен был бы служить тем же целям, вызывает лично у меня например эксепшн при попытке использования.

    4. Алисей Лебедев
      1 октября 2009

      Dev-сервер был в локальной сети? У меня MacFuse с внешней сетью работал отвратительно, зато ExanDrive тянет.

    5. Сергей Чикуенок
      1 октября 2009

      Да, dev-сервер в локальной сети

      @Neolord: судя по скрипту, он не будет работать с SFTP:

      if (fileName.indexOf('SFTP')>0)
      	return;
      
    6. Neolord
      1 октября 2009

      Сергей, эту строчку я вставил специально со следующей целью:
      Если открыть файл напрямую через ftp/sftp интерфейс аптаны (я пользуюсь только sftp), т.е. вьюшку Aptana->File, то там ctrl+s загружает и без всяких танцев с бубном, а без этой строчки он алёртит что у файла нет synchronization connection. Т.е. суть в том, чтобы автозагрузка включалась только внутри проекта.
      Так что тут можно еще чутка допилить под свои нужды =)

    7. malyshev
      2 октября 2009

      Пользуюсь Create Remote Project из Remote System Explorer, пока нареканий не было.
      Но надо будет глянуть в сторону FileSync, может удобнее будет.

    8. Vii
      3 октября 2009

      …И я озадачился тем, чтобы над проектом можно было работать локально, а вот проверять его можно было на удаленном dev-сервере. То есть я правлю файл, сохраняю его, при необходимости делаю build (объединение и минификация JS и CSS) и все изменившиеся файлы автоматически попадают на dev-сервер…

      Я правильно понял, локальный java-проект у тебя, всё же бы запущен и фактически разработка/отладка кода велась в нём?
      Просто если нет, не очень в голове укладывается: делать билд проекта при каждой (даже маленькой) правке в CSS чтобы взглянуть что получится? Мой комп в офисе на такое точно не способен :))

    9. Сергей Чикуенок
      4 октября 2009

      Я правильно понял, локальный java-проект у тебя, всё же бы запущен и фактически разработка/отладка кода велась в нём?

      Не совсем так. Да, java-апплет был запущен локально, но я не занимаюсь серверной частью, только клиентской. То есть отлаживал я только HTML/CSS/JS/XSL. А насчет билда при каждом сохранении, у меня сделано так. Я написал специальный билдер, который, во-первых, сжимает только те файлы, которые поменялись. Если библиотека состоит из 10 js-файлов, но ни один из них не поменялся — ничего не делается. Таким образом я экономлю ресурсы и, нет лишних изменившихся файлов в SVN, нет сброса кэша при каждом коммите. Во-вторых, этот билдер ведет лог файлов, из которых состоит библиотека, в XML. Этот файл затем подтягивается в XSL, и если я смотрю сайт со специальным параметром (?mode=debug), то вместо пожатого файла отдается 10 исходников. Так что билд при каждом сохранении, в принципе, не обязателен. Можно только перед коммитом сделать.

    10. Vii
      8 октября 2009

      …Разработчик локально, у себя на компьютере, вносит необходимые изменения и делает коммит в репозиторий…

      Я вот подумал, а как быть в этом случае с базой данных, ведь очень часто вносимые изменения в шаблонах напрямую зависят от структуры sql-таблиц (например, необходимо добавить новый функционал).

    11. Сергей Чикуенок
      8 октября 2009

      Я тоже периодически думаю об этой проблеме. Тут надо использовать механизм миграций (что-то вроде South для Django), но эти миграции должны быть двунаправленными (dev → production и production → dev)

    12. 31 октября 2010

      Интересный блог! Темы остаются актуальными и на сегодняшний день.

    13. 12 января 2011

      Спасибо за интересную статью

    14. Yury
      22 августа 2011

      Спасибо, Сергей.
      После 9 часов мозгатраха — воспользовался данной статьёй.
      WebDrive + Eclipse и всё заработало!

    15. 26 сентября 2011

      полезно, интересно, актуально, спасибо!

    16. 1 октября 2011

      У меня что-то не получается. Прочту еще раз, вдруг просто упустил что-то. А так инструкцию для чайников бы…

    17. 28 октября 2011

      А что если просто не синхронизировать а открывать файл на при монтированном диске и сохранять на него же ? Данные по идеи должны изменится на сервере …

    18. BigForceGun
      19 ноября 2011

      А вот у меня с глюками.
      В 1 случае из 2х то ли file sync , то ли web drive лажают — и на сервер попадает недокачанная версия файла, обрезанная то посередине, то ближе к началу, то к концу.
      Работать не возможно практически.

    19. Роман
      6 марта 2012

      Здравствуйте, Сергей. Как при работе в Eclipse напрямую через FTP (без создания проекта) сделать code complete PHP?
      Обыскал весь интернет, ничего не нашел. Zend Studio дописывает код при работе с FTP, а Eclipse не хочет.

    20. Сергей Чикуенок
      6 марта 2012

      Роман, code complete работает только в том случае, если создаёте проект с определённой природой (nature). Иначе Eclipse не будет знать, где брать данные для комплита и какой плагин для этого использовать.

      Посмотрите в сторону RSE Remote Project, возможно, он поможет создать удалённый проект