Мы уже несколько лет используем svn:externals
, указывающий на общий код. У нас были некоторые интересные проблемы, которые вы, вероятно, должны рассмотреть, прежде чем использовать его. Вот структура, которая у нас есть:
root
+---common
| +---lib1
| | \---trunk
| | +---include
| | \---src
| \---lib2
| \---trunk
| +---include
| \---src
+---proj1
| \---trunk
| +---include
| | \---common
| \---src
| \---common
\---proj2
\---trunk
+---include
| \---common
\---src
\---common
Каталоги common
в include
и src
в проекте содержат внешние определения, которые используются в общих библиотеках:
c:\dev> svn pget -v svn:externals proj1\trunk\src\common
Properties on 'c:\dev\proj1\trunk\src\common':
svn:externals : lib1 http://.../common/lib1/trunk/src
lib2 http://.../common/lib2/trunk/src
Проблема, с которой мы столкнулись, является многогранной, но она связана с маркировкой и ветвлением нашего источника, поскольку проекты меняются во времени. Определение внешнего кода, которое я показал выше, имеет несколько довольно серьезных проблем, если вы хотите иметь воспроизводимые сборки:
- Это относится к динамической цели -
trunk
.
- Это не относится к явной ревизии.
Когда вы выполняете ветвление, используя svn copy
, внешние элементы копируются дословно, поскольку они на самом деле являются просто свойствами, прикрепленными к объекту. Некоторые другие команды svn (commit
, checkout
и export
) фактически интерпретируют свойства. Когда вы помечаете проект, вы действительно хотите сохранить его состояние на все времена. Это означает, что вам нужно «прикрепить» внешние элементы к определенной ревизии, поэтому вам нужно изменить определение внешних элементов, чтобы они явно ссылались на нужную версию (например, "lib1 -r42 http://.../common/lib1/trunk/src"
). Это решает один аспект проблемы.
Если вам нужно поддерживать несколько несовместимых ветвей общего кода, то вам нужно указать, какую ветвь вы хотите явно вместе с (возможно) ревизией.
Излишне говорить, что это может быть немного головной болью. К счастью, кто-то там, на земле Subversion, пишет сценарий svncopy.pl
, который автоматизирует некоторые из этих проблем. Мы по-прежнему (и до сих пор) боремся с некоторыми трудностями, поддерживающими это в развернутом в полевых условиях продукте с кучей общего кода и мандатом трех различных версий в полевых условиях в любое время.
Если вы пойдете по этому пути, то обязательно подумайте, как вы будете поддерживать связи по мере роста и изменения проектов. Мы обнаружили, что немного времени на размышления о процессе здесь будут иметь большое значение.