Если вы будете следовать моим рекомендациям, приведенным ниже (я делал это годами), вы сможете:
- поместите каждый проект в любое место в системе управления версиями, пока вы сохраняете структуру из корневого каталога проекта вниз
- создавайте каждый проект в любом месте на любой машине с минимальным риском и минимальной подготовкой
- строить каждый проект полностью автономным, если у вас есть доступ к его двоичным зависимостям (локальные каталоги «библиотека» и «выходные данные»)
- строить и работать с любой комбинацией проектов, поскольку они независимы
- создавать и работать с несколькими копиями / версиями одного проекта, поскольку они независимы
- Избегайте загромождения репозитория системы управления версиями сгенерированными файлами или библиотеками
Рекомендую (вот говядина):
Определите каждый проект для создания одного основного конечного результата, например .DLL, .EXE или .JAR (по умолчанию в Visual Studio).
Структурируйте каждый проект как дерево каталогов с одним корнем.
Создайте сценарий автоматической сборки для каждого проекта в его корневом каталоге, который будет строить его с нуля, без каких-либо зависимостей от IDE (но не препятствуйте его созданию в среде IDE, если это возможно).
Рассмотрим nAnt для проектов .NET в Windows или что-то подобное в зависимости от вашей ОС, целевой платформы и т. Д.
Сделайте так, чтобы каждый сценарий сборки проекта ссылался на свои внешние (сторонние) зависимости из единого локального каталога общей «библиотеки», причем каждый такой двоичный файл ПОЛНОСТЬЮ идентифицировался по версии: %DirLibraryRoot%\ComponentA-1.2.3.4.dll
, %DirLibraryRoot%\ComponentB-5.6.7.8.dll
.
Сделайте так, чтобы каждый сценарий сборки проекта публиковал основной результат в единственном локальном общем «выходном» каталоге: %DirOutputRoot%\ProjectA-9.10.11.12.dll
, %DirOutputRoot%\ProjectB-13.14.15.16.exe
.
Сделайте так, чтобы каждый сценарий сборки проекта ссылался на свои зависимости через настраиваемые абсолютные пути с полной версией (см. Выше) в каталогах «library» и «output», И НЕТ ГДЕ ДРУГОЕ.
НИКОГДА не позволяйте проекту напрямую ссылаться на другой проект или какое-либо его содержимое - разрешайте ссылки только на основные результаты в "выходном" каталоге (см. Выше).
Сделайте так, чтобы каждый скрипт сборки проекта ссылался на необходимые инструменты сборки, используя настраиваемый абсолютный путь с полной версией: %DirToolRoot%\ToolA\1.2.3.4
, %DirToolRoot%\ToolB\5.6.7.8
.
Сделайте каждый проект сборки сценарий содержания ссылки источник по абсолютному пути относительно корневой директории проекта: ${project.base.dir}/src
, ${project.base.dir}/tst
(синтаксис варьируется в зависимости от инструмента сборки).
ВСЕГДА требуется, чтобы сценарий сборки проекта ссылался на КАЖДЫЙ файл или каталог через абсолютный настраиваемый путь (с корнем в каталоге, указанном настраиваемой переменной): ${project.base.dir}/some/dirs
или ${env.Variable}/other/dir
.
НИКОГДА не позволяйте сценарию сборки проекта ссылаться на НИЧЕГО с относительным путем, например .\some\dirs\here
или ..\some\more\dirs
, ВСЕГДА используйте абсолютные пути.
НИКОГДА не позволяйте сценарию сборки проекта ссылаться на НИЧЕГО, используя абсолютный путь, который не имеет настраиваемого корневого каталога, например C:\some\dirs\here
или \\server\share\more\stuff\there
.
Для каждого настраиваемого корневого каталога, на который ссылается сценарий сборки проекта, определите переменную среды, которая будет использоваться для этих ссылок.
Попытайтесь минимизировать количество переменных среды, которые необходимо создать для настройки каждой машины.
На каждой машине создайте сценарий оболочки, который определяет необходимые переменные среды, специфичные для ЭТОЙ машины (и, возможно, специфичные для этого пользователя, если это необходимо).
НЕ помещайте машинно-зависимый сценарий оболочки конфигурации в систему управления версиями; вместо этого для каждого проекта зафиксируйте копию сценария в корневом каталоге проекта в качестве шаблона.
ТРЕБУЕТСЯ каждый сценарий сборки проекта для проверки каждой из его переменных среды и прерывание с выводом значимого сообщения, если они не определены.
ТРЕБУЕТСЯ каждый сценарий сборки проекта для проверки каждого из его зависимых исполняемых файлов инструмента сборки, файлов внешних библиотек и зависимых файлов результатов проекта и прекращает работу с выдачей значимого сообщения, если эти файлы не существуют.
УСТОЙЧИВАЙТЕСЬ перед соблазном зафиксировать ЛЮБЫЕ сгенерированные файлы в системе управления версиями - без результатов проекта, без сгенерированного источника, без сгенерированной документации и т. Д.
Если вы используете IDE, сгенерируйте любые файлы управления проектом, которые вы можете, и не фиксируйте их в системе управления версиями (включая файлы проекта Visual Studio).
Установите сервер с официальной копией всех внешних библиотек и инструментов, которые будут скопированы / установлены на рабочих станциях разработчиков и сборочных машинах. Сделайте резервную копию вместе с репозиторием системы управления версиями.
Установите сервер непрерывной интеграции (машину сборки) без каких-либо инструментов разработки.
Рассмотрим инструмент для управления внешними библиотеками и результатами, например Ivy (используемый с Ant).
НЕ используйте Maven - это сначала сделает вас счастливыми, а в конечном итоге заставит плакать.
Обратите внимание, что ничто из этого не является специфическим для Subversion, и большинство из них является общим для проектов, нацеленных на любую ОС, оборудование, платформу, язык и т. Д. Я действительно использовал немного синтаксиса, специфичного для ОС и инструмента, но только для иллюстрации - -Я надеюсь, что вы переведете на вашу ОС или инструмент по выбору.
Дополнительное примечание относительно решений Visual Studio: не помещайте их в систему контроля версий! При таком подходе они вам вообще не нужны или вы можете их сгенерировать (как файлы проекта Visual Studio). Однако я считаю, что лучше оставить файлы решений отдельным разработчикам, чтобы они создавали / использовали их по своему усмотрению (но не регистрировали в системе управления версиями). Я храню Rob.sln
файл на своей рабочей станции, из которого я ссылаюсь на мои текущие проекты. Поскольку все мои проекты автономны, я могу добавлять / удалять проекты по своему желанию (что означает отсутствие ссылок на зависимости на основе проектов).
Пожалуйста, не используйте внешние элементы Subversion (или аналогичные в других инструментах), они являются анти-шаблоном и поэтому не нужны.
Когда вы реализуете непрерывную интеграцию или даже если вы просто хотите автоматизировать процесс выпуска, создайте для этого сценарий. Создайте единый сценарий оболочки, который: принимает параметры имени проекта (как указано в репозитории) и имени тега, создает временный каталог в настраиваемом корневом каталоге, проверяет источник для данного имени проекта и имени тега (путем создания соответствующий URL-адрес в случае Subversion) к этому временному каталогу, выполняет чистую сборку, которая запускает тесты и упаковывает результат. Этот сценарий оболочки должен работать с любым проектом и должен быть зарегистрирован в системе управления версиями как часть вашего проекта «инструментов сборки». Ваш сервер непрерывной интеграции может использовать этот сценарий в качестве основы для создания проектов или даже предоставить его (но вы все равно можете захотеть свой собственный).
@VonC: Вы НЕ хотите постоянно работать с "ant.jar", а не с "ant-abcdjar" после того, как вы сгорели, когда ваш скрипт сборки сломался, потому что вы неосознанно запустили его с несовместимой версией Ant. Это особенно характерно для Ant 1.6.5 и 1.7.0. Обобщая, вы ВСЕГДА хотите знать, какая конкретная версия КАЖДОГО компонента используется, включая вашу платформу (Java ABCD) и ваш инструмент сборки (Ant EFGH). В противном случае вы в конечном итоге столкнетесь с ошибкой, и ваша первая БОЛЬШАЯ проблема будет заключаться в отслеживании, какие версии ваших различных компонентов задействованы. Просто лучше решить эту проблему заранее.