Если нельзя, но очень хочется, то нужно обязательно и ничего в мире не стоит того, чтобы делать из этого проблему!


Интересна Java? Кликай по ссылке и изучай!
Если тебе полезно что-то из того, чем я делюсь в своем блоге - можешь поделиться своими деньгами со мной.
с пожеланием
столько времени читатели провели на блоге - 
сейчас онлайн - 

четверг, 11 февраля 2010 г.

Eclipse PDT + Subclipse + TortoiseSVN + Subversion + Denwer

Давно хотел написать этот мануал потому, что самое самое, с чем пришлось поиграться было настройка СВН для PHP так, как я привык к нему работая c Java. Изучая мегабайты статей в сети, я столкнулся с некой проблемой - часто чтобы понять что статья мне не подходит придется ее прочитать до половины. Потому попробую это исправить. Статья подойдет тем, кто пишет под PHP, пользуется Denwer (Apache, MySQL, PHP), Windows, Eclipse PDT и к этому всему хочет прикрепить прелести Subversion (SVN) используя для этого TortoiseSVN. Попал? Жмем дальше...

Изначально был выбран Denwer, не по воле моей, а по принуждению... :) Шучу. Жека спасибо! Так что, от него и будем отталкиваться.

Качаем TortoiseSVN последней версии тут http://tortoisesvn.net/downloads. Когда я качал, версия была 1.6.7. Тут внимательнее потому, что для других версий информация в статье может быть не совсем актуальная - и за за этого часто уходят часы времени, а все получается лишь после полного удаления всего установленного и попытки сделать все с чистого листа.
На рисунке я подчеркнул ту информацию, которая нам понадобится в будущем, а именно версия Subversion (не записав которую, пришлось поиграться вчера 2 часа) и версия Тортилки (TortoiseSVN). Последнее скорее для вас, чтобы быть в курсе об чем в статье. 

Установка классическая - указать имя папки, Next, Next, ..., Finish. Проблем быть не должно.  При запуске  видим это окно и жмем Next:
  
Дальше читаем и соглашаемся (или не соглашаемся) с условиями использования программы:
 
Выбираем папку в которую хотим установить (у меня места на C: нет, потому я ставлю все на D:, но это не существенно). После жмем Next:
 
Жмем Install:
Пока идет установка, мы можем нажать на Donate и помочь проекту. 
Когда установка завершена жмем Finish:
А на предложение перезагрузить компьютер соглашаемся (или сохраняем все что надо и перегружаем).

Сейчас у нас есть выбор создавать ли локальный репозиторий или удаленный. Т.к. я единственный кто правит проект - мне достаточно иметь локальный репозиторий и TortoiseSVN позволяет это сделать.

Создаем папку, в которой будет располагаться репозиторий. Эту папку хорошо бы спрятать подальше от глаз (чтобы случайно не удалить), а вообще лучше вынести на другой винчестер (не тот, на котором располагается проект). Я ее создал на своем переносном винчестере. Если теперь вызвать контекстное меню новой папки (кликнуть на папке правой кнопкой мыши), то мы увидим два новых пункта меню "SVN Checkout" и "TortoiseSVN". Нас интересует пока второй. В подменю выбираем "Create repository here".
В результате TortoiseSVN создаст там свой порядок.
Теперь нам стоит вызвать контекстноеменю папки репозитория и Вызвать "Repository Browser" (кликаем правой кнопкой мыши по пустому месту на папке, в меню выбираем "TortoiseSVN", а потом "Repository Browser")
Откроется диалог, который покажет внутреннюю структуру репозитория. Вызовем контекстное меню корневой папки репозитория и выберем пункт меню "Add folder..."
Выбираем папку с нашим проектом и жмем Ок
Дописываем комментарий к первой ревизии проекта и жмем Ок.
После ждем пока тортилка добавляет файлы
Процесс может занять несколько минут (или десятков - зависит от исходного размера проекта), возможно даже будет казаться, что все зависло. Главное ничего не предпринимать, а спокойно дождаться окончания. Чтобы немного успокоиться и увидеть, что процесс все таки идет - можно наблюдать за увеличением размера папки с репозиторием. Когда размер перестанет обновляться, а диалог диалог исчезнет - картинка в Repository Browser немного поменяется.
Наконец-то! Смотрим все ли нормально. Тут есть один важный момент, из за которого у меня ушло много времени. Оказывается при импорте папки тортилка халтурит. Как в первый раз, так и во второй (когда писал статью) программа не добавила файлы типа *.so, без которых Apache не запустится. Причина мне не ясна, но факт остается фактом - нам придется в ручную добавить эти файлы в репозиторий с помощью Repository Browser.

В Denwer файлы размещены в папке "D:\WebServers\usr\local\apache\modules". найдем ту же папку в браузере и перетянем их из Windows Explorer в Repository Browser. После перетаскивания файлов появится контекстное меню, в котором надо выбрать "Copy files here"
А если тортилка чего-то там спросит, сказать что "Да я уверен" - кажется она предлагает какой-то более оптимальный способ добавлять файлы.
 Добавляем комментарий и "коммитим" новую ревизию.
Раз уж тортилка один раз заглючила - гарантии, что она это сделала где-то еще раз нет. Придется проверять.

Идем в папку, где находится Denwer. Старую его копию можно забекапить (сохранить) на всякий пожарный. Вызываем контекстное меню папки (у меня Denwer был установлен на диск D:) и в меню выбираем "SVN Checkout..."
В диалоге редактируем путь в репозитории откуда делаем чекаут "Checkout" и путь куда мы его делаем. После жмем Ок.
После этого мы будем некоторое время наблюдать как переписываются все файлы проекта.
А когда проект (папка Denwer'a) будет скопирован, нажмем Ок.
Можно оглядеться. Новая папка и ее содержимое будет выглядеть немного иначе. + в каждой подпапке будет находится скрытая папка ".svn" в которой хранится служебная информация. К ним мы еще раз вернемся немного позже.
Теперь нам надо сделать ту самую проверку, а не заглючила ли тортилка еще раз? Сделаем копию новой папки рядом с исходной.
После удалим все папки ".svn" внутри - эти папки единственное, что отличает новую папку от исходной (которую мы сохранили как бекап). Удалить можно нажав на поиск (F3) внутри новой папки и найдя все скрытые папки ".svn".
В результатах поиска можно будет видеть все эти папки. Удалим все.
Удалив их мы сможем сравнить две папки: ту с корой все началось, и ту, которую мы только что отредактировали. В лучшем случае количество файлов, папок и общий размер (до последнего байта) будет одинаковый. Если нет - придется отыскать все отличия и сделать все то, что мы сделали с файлами типа *.so выше.  Надеюсь ты увидел такую картинку.
Если так, то можно спрятать бекап куда подальше, а копию с удаленными папками ".svn" удалить.

Все казалось бы готово для работы, но есть одно но. Denver (той версии, что я скачал) не расчитан для работы с SVN, а именно он не понимает папки ".svn", которые лежат теперь где не лень. Чтобы научить его игнорировать эти папки, придется немного покопаться в кишках Denwer.

Нас интересуют два файла. D:\WebServers\denwer\scripts\Control.pl и D:\WebServers\denwer\scripts\init.d\apache.pl.

В файле Control.pl необходимо найти и изменить строку с такой:
next if $e eq ".." || $e eq "." || uc $e eq 'CVS';
на такую:
next if $e eq ".svn" || $e eq ".." || $e eq "." || uc $e eq 'CVS';
Так Denwer не будет пытаться сделать из папки ".svn" виртальный хост.

В файле apache.pl необходимо найти и изменить строку с такой:
my $exe = fsgrep { /\Q$CNF{apache_exe}\E/i } $basedir;
на такую:
my $exe = "$basedir/bin/TrayApache.exe";
 Эту информацию предоставил mac2000 тут на форуме, за что огромное спасибо.

После этого можно запускать Debver и оттестировать, как все работает. Эксцессов быть не должно (но как всегда может что-то случиться). Если все работает, можно отправить этих два файла в репозиторий.

На этом первая половина статьи закончилась. Вторая будет намного проще - а именно, как интегрировать svn в Eclipse GDT. К счастью, на рабочей версии проекта удаление тортилки и создания тучи новых репозиториев никак не сказалось. Хух! Отсюда один хороший вывод. Бекап папки репозитория можно поднять в любом другом месте. Это хорошо! Поехали дальше!

Только для начала скажу зачем мне плагин для Eclipse. TortoiseSVN хорошая программа и очень удобна для разборок с ревизиями, когда никто больше помочь не может, но есть одно но. В составе TortoiseSVN есть утилита, которая показывает различия между измененным файлом и тем, что находится в репозитории, и она, мягко говоря? не очень удобна. Вот пример ее работы. 
А вот то же, только с помощью плагина Subclipse.
Согласитесь нагляднее. Решать конфликты проще в Subclipse, а то, что она интегрирована в IDE умножает ее баллы. Если что, в любой момент можно воспользоваться TortoiseSVN, и такое время от времени случается - одна голова хорошо, а две - лучше. 

Итак, настраиваем Subclipse для Eclipse GDT.

Открываем наш Eclipse GDT (тараньку смываем глотком пива, закусываем очередным куском тараньки, боковым ухом слышим на дискавери канале, что "...теплый материнский сосок всегда доступен...") и там идем в пункт меню "Help"->"Install new software..."
 В предлагаемом нам диалоге кликаем добавить
и указываем в качестве имени что-нибудь, а урл прописываем тот, который соответствует установленной версии SVN (помните, я говорил, что стоит ее запомнить?). Дело в том, что плагин для Eclipse PDT разрабатывается под соответствующую версию SVN движка. У меня версия Subversion - 1.6.9. Посмотреть какая версия плагина Subclipse соответствует нашей движка Subversion (на момент написания статьи) можно на сайте http://subclipse.tigris.org/ в разделе "Download and Install".

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

Итак информация на сайте гласит:
Subclipse 1.4.x includes and requires Subversion 1.5.x client features and working copy format.
Subclipse 1.6.x includes and requires Subversion 1.6.x client features and working copy format.

Links for 1.6.x Release:
Changelog: http://subclipse.tigris.org/subclipse_1.6.x/changes.html
Eclipse update site URL: http://subclipse.tigris.org/update_1.6.x
Zipped downloads: http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240

Links for 1.4.x Release:
Changelog: http://subclipse.tigris.org/subclipse_1.4.x/changes.html
Eclipse update site URL: http://subclipse.tigris.org/update_1.4.x
Zipped downloads: http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240
А значит нам надо в диалоге указать именно "http://subclipse.tigris.org/update_1.6.x". Указываем, жмем ОК и ждем получения информации об этом плагине. Выбираем там все что нам предлагается и жмем Next.
Снова Next
 Да, согласны! Finish.
Ждем завершения установки.
Если в ходе установки будет спрашивать, говорим да!
В конце соглашаемся перезагрузить IDE Eclipse.
А после перезагрузке в "PHP Explorer" вызываем контекстное меню проекта->"Team"->"Share project..."
В диалоге ничего не меняем и жмем Finish.
После мы увидим некоторые изменения в  в "PHP Explorer"
а именно информацию о ревизии, даты последнего изменения и имени пользователя, который сделал последнее изменение. Так же появится иконка, которая говорит о состоянии файла - новый, удаленный, измененный, не изменненный...  А так, же у нас появится в меню "Team" контекстного меню проекта (или папки/файлы) много действий, которые так же предоставляет TortoiseSVN в Windows Explorer.
Ну вот и все!

На статью было затрачено 4 часа, 1 перезагрузка, 1 бокал пива, пол леща, ну и конечно же часы ночных расследований когда было только желание сделать так, как это было когда-то когда работал на Java. Совет, если ты ведешь блог и хочешь писать подобные мануалы, пиши статью сразу - иначе потом придется себя сильно заставлять и переустанавливать все с самого начала.

Надеюсь, статья сэкономит больше времени, чем было затрачено на нее, и PageRank мне в помощь. 
 
Спасибо Жека за ПХП проект и комментарий "я люблю мануалы со скриншотами, где каждый шаг разжеван" - я тоже люблю, спасибо Интернет и Google за информацию, спасибо Ксюха за ням-ням и понимание.

8 комментариев:

  1. Спасибо, классный туториал! Я тоже хотел написать нечто подобное про локальный SVN :) но ввиду интересности инфы у тебя - не буду.
    По поводу so файлов - предположу что их не импортируют по умолчанию потому что системы контроля версий обычно приучены игнорировать "исполняемые файлы" - exe, so, ... Наверняка это где-то настраивается.

    ОтветитьУдалить
  2. Рад что понравилось. Интересно почему они приучены что либо игнорировать? - это не ожидается конечным пользователем.

    ОтветитьУдалить
  3. Приучены игнорировать наверное потому, что считают по умолчанию что эти исполняемые файлы - избыточная информация, которую можно воссоздать из исходников.
    Например если ддя java есть папки src - с java-файлами и bin - с .class-файлами, наверное по умолчанию class-файлы будут проигнорированы, так как их компилятор сам создаст.

    ОтветитьУдалить
  4. Думаю ты прав. А инфы в сети по ним я так и не нашел... И теперь еще больше не доверяю - доверяй но перепроверяй...

    ОтветитьУдалить
  5. .so файлы по умолчанию запрещены у TortoiseSVN
    Правой кнопкой на репозитарии TortoiseSVN/Setting/General/Global ignore pattern

    ОтветитьУдалить
  6. Ага, читайте мануалы, называется.

    ОтветитьУдалить
  7. А зачем весь каталог денвера бекапить?
    Проще только папку home.
    собственно только там проекты над которыми вы работаете..
    и там нет .so

    ОтветитьУдалить
  8. Люблю следить за изменениями.
    Кроме того работал за тремя разными компами и проще было таскать с собой одну базу SVN и делать либо полный чекаут, либо апдейт всего проекта вместе с денвером.

    ОтветитьУдалить