Если вы будете следовать моим рекомендациям ниже (у меня есть в течение многих лет), вы сможете:
- помещать каждый проект в любом месте в системе контроля версий, если вы сохраняете структуру из корневого каталога проекта в
- создайте каждый проект в любом месте на любом компьютере с минимальным риском и минимальной подготовкой
- создавать каждый проект полностью автономно, если у вас есть доступ к его двоичным зависимостям (локальные каталоги "library" и "output")
- создавать и работать с любой комбинацией проектов, поскольку они независимы
- сборка и работа с несколькими копиями / версиями одного проекта, поскольку они независимы
- избегайте засорения вашего хранилища контроля версий сгенерированными файлами или библиотеками
Я рекомендую (вот говядина):
Определите каждый проект для создания одного основного конечного результата, такого как .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", И НЕТ, ГДЕ ЕЩЕ.
НИКОГДА не позволяйте проекту напрямую ссылаться на другой проект или любое его содержимое - разрешайте ссылки только на первичные результаты в каталоге «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-a.b.c.d.jar" после того, как вы сгорели, когда сломался ваш скрипт сборки, потому что вы по незнанию запустили его с несовместимой версией Ant. Это особенно распространено между Ant 1.6.5 и 1.7.0. Обобщая, вы ВСЕГДА хотите знать, какая конкретная версия КАЖДОГО компонента используется, включая вашу платформу (Java A.B.C.D) и ваш инструмент сборки (Ant E.F.G.H). В противном случае вы в конечном итоге столкнетесь с ошибкой, и ваша первая БОЛЬШАЯ проблема будет отслеживать, какие версии ваших компонентов задействованы. Просто лучше решить эту проблему заранее.