Pull to refresh

SVN → Подключение внешних библиотек

Reading time3 min
Views6.1K
Итак, сегодня речь пойдет о подключении внешних библиотек (суб-проектов) в основные проекты с использованием Subversion.
По старой доброй традиции, в качестве клиента для работы с SVN будет использоваться давно полюбившийся нам TortoiseSVN.

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

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

Для примера, давайте определим исходные данные:
у нас есть два проекта («Один», «Два») и одна библиотека («Library»), которую необходимо внедрить в оба проекта. Пусть у нас будет следующий путь до этой библиотеки: subserver/code/library/trunk.
Рабочие копии обоих проектов у нас есть. Предположим, что в каждом из них есть папка /libraries/, внутри которой нам нужно создать папку /library/, в которой и будет лежать наша внешняя библиотека.
Я изначально указываю на то, что библиотека будет лежать в отдельной папке, т.к. свойство svn:externals, которое мы будем использовать, работает только с папками.

Дальше, все получается очень просто: открываем свойства папки /libraries/ любого из проектов (два проекта описываются исключительно для того, чтобы показать, как работает обновление). Выглядеть оно будет примерно так:



Нажимаем кнопочку Add..., и видим окно для добавления свойств, примерно следующее:



В выпадающем списке выбираем пункт svn:externals (первый в списке). Далее нам необходимо прописать значение свойства. Для svn:externals значением является строчка следующего вида:
Имя-Папки Путь-К-Репозиторию, где для нашего примера имя папки будет: library, а путь к репозиторию будет: subserver/code/library/trunk.
Дословно наша строчка будет выглядеть так:
library subserver/code/library/trunk

Путь к репозиторию можно легко получить, воспользовавшись утилитой Repo-browser, входящий в поставку TortoiseSVN.
Разделителем может служить один или несколько символов пробела или табуляции. Лично я использую четыре пробела.

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

Собственно, на этом все нововведения заканчиваются. Сохраняем свойства.
Далее, нам необходимо сделать Update, чтобы убедиться, что все верно и библиотека успешно загрузится в проект. При этом папка /library/ будет создана автоматически. Если все гладко, делаем Commit, чтобы сохранить свойства папки непосредственно в репозитории проекта. С этого момента, во всех рабочих копиях этого проекта (т.е. у всех разработчиков) нужная библиотека будет подключаться автоматически.

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

Теперь допустим ситуацию, когда при работе над проектом «Два» нам необходимо изменить что-то в библиотеке. Мы вносим эти изменения непосредственно в файлы, которые физически находятся в папке /libraries/library/. После того, как все изменения были внесены, мы делаем Commit. И изменения автоматически заносятся в репозиторий библиотеки: subserver/code/library/trunk. Если теперь сделать Update проекта «Один», туда будет загружена обновленная версия библиотеки.
Тут есть тонкий момент относительно комментариев, добавляемых к Commit'у: если изменения касаются и проекта, и библиотеки, то все комментарии запишутся в логи и к проекту, и к библиотеке. Так что я рекомендую сохранять подобные изменения отдельными ревизиями.

Еще одна потенциальная опасность, с которой могут столкнуться неопытные программисты — несовместимость новой версии библиотеки с каким-то из проектов. На это есть два ответа: 1. пишите совместимый код, чтобы он работал везде. 2. Можете использовать ветки (branch), чтобы отделить предыдущую версию библиотеки, и подключить в проект ее (полностью аналогичным способом).

И, напоследок, практически цитата из документации: помните, что svn:externals — это свойства папки, таким образом, если ваш проект или внешняя библиотека будут куда-то перемещены (напр. Relocate'ом), пути в свойствах не изменятся автоматически, их нужно будет исправлять вручную.

Вот, в общем-то, и все, что я хотел вам сегодня поведать.
Как всегда, с удовольствием почитаю ваши комментарии.
Tags:
Hubs:
Total votes 20: ↑18 and ↓2+16
Comments31

Articles