-
Автоматическое копирование файлов на FTP/SSH в Eclipse
В последнее время все чаще и чаще слышны просьбы веб-разработчиков сделать удобную работу в любимом редакторе/IDE, чтобы изменившиеся файлы автоматически попадали на удаленный сервер. Самый простой способ решить эту задачу — редактировать файлы напрямую на сервере. Хотя это вполне рабочее решение, у него есть ряд недостатков, самый большой из которых: отсутствие локальной копии файла. В случае, если ваш коллега через 5 минут закачает свою, исправленную и дополненную версию файла, можно быть уверенным, что ваши изменения потеряются безвозвратно. Более того, этот способ годиться только для мелких исправлений, на 5—10 минут. Если же нужно решить какую-то более глобальную задачу, дней на 5, например, вам в любом случает придется держать локальную копию проекта, чтобы спокойно переводить его в нерабочее состояние.
Самый правильный способ решения задач с синхронизацией файлов, который проповедуют все маститые разработчики — использовать систему версионного контроля (VCS), вроде SVN или Git. Рабочий процесс в этом случае выглядит следующим образом. Разработчик локально, у себя на компьютере, вносит необходимые изменения и делает коммит в репозиторий. В этот момент у репозитория срабатывает хук (некий скрипт), который берет изменившиеся файлы и закачивает на продакшн-сервер. Это идеальное решение для командной работы, когда необходимо объединять свои исправления с чужими. И еще, как бонус: нет необходимости бегать по 10 разным папкам и вручную копировать изменившиеся файлы на сервер. Достаточно нажать всего на одну кнопку — и абсолютно все необходимые файлы оказываются на сервере. Многих, почему-то, пугает такая «сложность», хотя на настройку окружения требуется времени не больше, чем на очередной перекур или чтение новостей.
Ну ладно, оставим это на совести каждого конкретного человека. Недавно у меня возникла, скажем так, промежуточная задача. Весь проект лежит в SVN, автоматом закачивается на продакшн — все работает просто замечательно. Только сайт написан на Java, и для его локального запуска требуется ой как много ресурсов, особенно если параллельно работает Eclipse, фотошоп и виртуальная машина с виндой. Обычный рефреш страницы занимал минуту. И я озадачился тем, чтобы над проектом можно было работать локально, а вот проверять его можно было на удаленном dev-сервере. То есть я правлю файл, сохраняю его, при необходимости делаю build (объединение и минификация JS и CSS) и все изменившиеся файлы автоматически попадают на dev-сервер, без каких-либо лишних телодвижений. Решение оказалось довольно простым и элегантным, возможно, сработает и для других редакторов и IDE. Итак:
- Под *nix системы есть замечательный проект под названием FUSE, который позволяет монтировать удаленный сервер как обычную папку в локальной файловой системе. На Маке я использовал MacFuse + оболочку MacFusion для настройки FTP/SSH-серверов. На винде можно использовать платный WebDrive или NetDrive для этих же целей.
- Устанавливаем FUSE или WebDrive/NetDrive, настраиваем подключение к серверу и монтируем его как локальную папку.
- Для Eclipse ставим плагин FileSync, задача которого — автоматически синхронизировать проект с какой-нибудь внешней папкой. Синхронизация одностронняя: копируются файлы из проекта в папку, но не из папки в проект.
- Идем в настройки проекта (Project → Properties) в секцию File synchronization и настраиваем синхронизацию для проекта (пример с сайта разработчика):
Настроить синхронизацию можно довольно гибко: можно исключить какие-то папки из синхронизации, можно использовать переменные в путях.
- Не забываем включить автобилд (Project → Build Automatically), чтобы при любом изменении ресурсов проекта файлы автоматически синхронизировались, и опцию General → Workspace → Refresh automatically в настройках Eclipse, чтобы файлы, добавленные вне Eclipse (например, картинку новую скопировали) автоматически появлялись в проекте.
Все, теперь можно спокойно и без лишних телодвижений локально редактировать проект и тут же проверять его на удаленном сервере.
UPD: Решение от Neolord для работы со стандартным синхронизатором из Aptana.
20 комментариев
>>> На винде можно использовать платный WebDrive или NetDrive для этих же целей.
А чем Samba плохо? На dev-сервере самба, в винде присоединил сетевой диск — вуаля, все готово
Можно и Самбу поставить. Только, чую, не каждый админ захочет с ней возиться ради этого 🙂
Могу предложить чуть более простое решение для тех, у кого стоит Аптана как плагин.
В ней есть вьюшка 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, который по идее должен был бы служить тем же целям, вызывает лично у меня например эксепшн при попытке использования.
Dev-сервер был в локальной сети? У меня MacFuse с внешней сетью работал отвратительно, зато ExanDrive тянет.
Да, dev-сервер в локальной сети
@Neolord: судя по скрипту, он не будет работать с SFTP:
Сергей, эту строчку я вставил специально со следующей целью:
Если открыть файл напрямую через ftp/sftp интерфейс аптаны (я пользуюсь только sftp), т.е. вьюшку Aptana->File, то там ctrl+s загружает и без всяких танцев с бубном, а без этой строчки он алёртит что у файла нет synchronization connection. Т.е. суть в том, чтобы автозагрузка включалась только внутри проекта.
Так что тут можно еще чутка допилить под свои нужды =)
Пользуюсь Create Remote Project из Remote System Explorer, пока нареканий не было.
Но надо будет глянуть в сторону FileSync, может удобнее будет.
Я правильно понял, локальный java-проект у тебя, всё же бы запущен и фактически разработка/отладка кода велась в нём?
Просто если нет, не очень в голове укладывается: делать билд проекта при каждой (даже маленькой) правке в CSS чтобы взглянуть что получится? Мой комп в офисе на такое точно не способен :))
Не совсем так. Да, java-апплет был запущен локально, но я не занимаюсь серверной частью, только клиентской. То есть отлаживал я только HTML/CSS/JS/XSL. А насчет билда при каждом сохранении, у меня сделано так. Я написал специальный билдер, который, во-первых, сжимает только те файлы, которые поменялись. Если библиотека состоит из 10 js-файлов, но ни один из них не поменялся — ничего не делается. Таким образом я экономлю ресурсы и, нет лишних изменившихся файлов в SVN, нет сброса кэша при каждом коммите. Во-вторых, этот билдер ведет лог файлов, из которых состоит библиотека, в XML. Этот файл затем подтягивается в XSL, и если я смотрю сайт со специальным параметром (?mode=debug), то вместо пожатого файла отдается 10 исходников. Так что билд при каждом сохранении, в принципе, не обязателен. Можно только перед коммитом сделать.
Я вот подумал, а как быть в этом случае с базой данных, ведь очень часто вносимые изменения в шаблонах напрямую зависят от структуры sql-таблиц (например, необходимо добавить новый функционал).
Я тоже периодически думаю об этой проблеме. Тут надо использовать механизм миграций (что-то вроде South для Django), но эти миграции должны быть двунаправленными (dev → production и production → dev)
Интересный блог! Темы остаются актуальными и на сегодняшний день.
Спасибо за интересную статью
Спасибо, Сергей.
После 9 часов мозгатраха — воспользовался данной статьёй.
WebDrive + Eclipse и всё заработало!
полезно, интересно, актуально, спасибо!
У меня что-то не получается. Прочту еще раз, вдруг просто упустил что-то. А так инструкцию для чайников бы…
А что если просто не синхронизировать а открывать файл на при монтированном диске и сохранять на него же ? Данные по идеи должны изменится на сервере …
А вот у меня с глюками.
В 1 случае из 2х то ли file sync , то ли web drive лажают — и на сервер попадает недокачанная версия файла, обрезанная то посередине, то ближе к началу, то к концу.
Работать не возможно практически.
Здравствуйте, Сергей. Как при работе в Eclipse напрямую через FTP (без создания проекта) сделать code complete PHP?
Обыскал весь интернет, ничего не нашел. Zend Studio дописывает код при работе с FTP, а Eclipse не хочет.
Роман, code complete работает только в том случае, если создаёте проект с определённой природой (nature). Иначе Eclipse не будет знать, где брать данные для комплита и какой плагин для этого использовать.
Посмотрите в сторону RSE Remote Project, возможно, он поможет создать удалённый проект