Что делать, когда ваш процесс сборки муравья попадает под контроль версий
Итак, у меня есть хороший Java-проект, сборка с Ant в папку / dist.
Весь проект находится под контролем версий, поэтому я могу развернуть последнюю версию, просто 'svn export' по пути к папке dist.
Но моя сборка продолжает удалять папки.svn внутри моей папки dist и всех ее зависимых элементов, потому что она очищает папку при сборке, а не просто перезаписывает. Точный виновник - JarBundler, задача Ant, которая создает мой пакет mac.app - он удаляет папку всего пакета перед его воссозданием.
Это, очевидно, портит мою SVN, потому что все папки.SVN теперь отсутствуют для этой папки, и поэтому он говорит, что в конфликте.
У кого-нибудь есть идеи, как мне это решить? Я не могу понять, как остановить jarbundler от удаления всего, так что я собираюсь сделать что-то более хакерское, я боюсь. Я тоже новичок в Ant, просто для справки.
5 ответов
Использование dist в управлении исходным кодом может считаться хорошей практикой, если вы хотите, чтобы ваша система управления исходным кодом была уникальной ссылкой для всех:
- Разработчики
- ассемблеры (юнит-тестирование)
- тестировщики омологации (вы запрашиваете кучу dist на своей платформе интеграции и проводите там свои нерегрессионные тесты, тесты perfs, стресс-тесты и т. д.)
- менеджеры по выпуску продукции...
НО у вас должен быть правильный процесс выпуска, чтобы справиться с этим.
В вашем случае сборка должна находиться в отдельном и приватном каталоге, то есть в каталоге, который не находится в subversion. Когда сборка в порядке, вы импортируете ее в Subversion, если это официальный выпуск, или импортируете ее в общий каталог, если это временная сборка, просто необходимая следующей команде (таким образом, избегая фиксации сотен сборок в SCM, используя пространство для ничего).
Примечание. Основное преимущество наличия доставки (dist) в вашей SCM состоит в том, чтобы позволить зависимому проекту работать не с вашими источниками, а непосредственно с вашей доставкой (которая в тот или иной момент должна быть запущена в производство): если они управляют чтобы заставить их код работать, компилируя с вашей доставкой, шансы их собственного дистрибутива при развертывании с вашей будут работать.
Таким образом, другие команды получают доступ к вашей доставке (ваш "myProject.jar"), когда они получают доступ к любому из своих источников: они могут через SCM прочитать версию вашего jar, его дату, его историю, его метаданные, его метку и скоро.
Тем не менее, для одного небольшого монолитного (как "ни один другой проект не зависит от него") проекта можно утверждать, что dist (конечная пакетная поставка) может быть перестроена по требованию и сохранена во внешней ссылочной системе как внешняя. Репозиторий Maven, например.
НО: Maven не является репозиторием SCM, это означает, что вам нужно подписать свой jar ('MyProject-1.0.jar'), у вас нет истории, и вам необходимо сообщать все свои метаданные в отдельном текстовом файле во время доставки. Любой другой проект, имеющий доступ к этой доставке в этом репозитории Maven, должен настроить свои сценарии и пути к классам в соответствии с вашим соглашением об именах версий.
Кроме того, Maven - это еще один репозиторий в вашей архитектуре разработки. Всякий раз, когда вы можете сократить количество репо до минимума ("1";)), это лучше.
Просто. Не проверяйте in /dist для контроля версий.
Контроль версий действительно не должен иметь никакого сгенерированного кода /binaries/jars/what-have-you.
Возможно, я что-то здесь упускаю, но почему ваши встроенные продукты проверены в вашей системе контроля версий? Как правило, это не считается хорошей практикой.
Если вы хотите проверить продукты сборки, скопируйте их в другое место (возможно, в каталог "pre-build") и зарегистрируйте их оттуда.
Отредактировано для добавления: причина, по которой вам не нужно этого делать, заключается в том, что, учитывая текущий источник, вы должны иметь возможность воссоздать дистрибутив с помощью одной команды сборки.
Я бы согласился, что не очень хорошая практика - встраивать продукты в SVN.
При этом, если у вас есть какие-то требования, которые вы не можете обойти, вы можете использовать одну из более современных систем контроля версий, таких как Git, Bazaar и Darcs (есть и другие, но я использовал эти три).
Все три из них только помещают метаданные контроля версий в корневой каталог, поэтому в подпапках нет метаданных, поэтому я думаю, что у вас не возникнет этой проблемы...
Хорошо, спасибо всем. Теперь я понимаю, почему с философской точки зрения хорошей идеей будет продолжать сборку из SCM, и буду помнить об этом в будущем. Тем не менее, практически, в этом случае я единственный разработчик в этом коротком (4 недели) проекте. Я использую svn для простого обновления сборки релиза на общедоступном веб-сервере через низкоскоростное соединение, так что дифференциальное обновление необходимо. Поскольку никто не предложил простую альтернативу обновлению сборок для удаленного развертывания, я придумал этот хакерский взлом, чтобы избежать моей проблемы:
Скажи, что моя версионная папка сборки - /dist. Хорошо, я говорю моему скрипту сборки, чтобы он собрал в /dist-tmp, затем рекурсивно скопировал все файлы из /dist-tmp поверх /dist, и, наконец, удалил /dist-tmp.
В моем скрипте сборки Ant было несколько дополнительных строк, и он прекрасно работает.
В следующий раз, хотя я не уверен, что хост развертывания не имеет окон, а затем простой скрипт rsync сделает свое дело, и тогда я смогу оставить сборки вне SCM.
@VonC получает галочку ответа для лучшего объяснения философии.