Что делать, если ваш процесс сборки муравьев срывается с вашим контролем версий

Итак, у меня есть хороший Java-проект, построенный с помощью Ant в папку / dist.
Весь проект находится под контролем версий, поэтому я могу развернуть последнюю версию, просто нажав svn export на пути к папке dist. .
Но моя сборка продолжает удалять папки .svn внутри моей папки dist и все ее иждивенцы, потому что она очищает папку при сборке, а не просто перезаписывает. Точный виновник - JarBundler, задача Ant, которая строит мой пакет mac.app - он удаляет всю папку пакета, прежде чем воссоздать его.
Это, очевидно, портит мой svn, потому что все папки .svn теперь отсутствуют для этой папки и так что он говорит, что находится в конфликте.

У кого-нибудь есть идеи, как я могу это решить? Я не могу понять, как остановить удаление всего jarbundler'ом, так что, боюсь, мне придется сделать что-то более взломанное. Я тоже новичок в Ant, просто для справки.


person dalyons    schedule 21.10.2008    source источник


Ответы (5)


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

  • Разработчики
  • ассемблеры (юнит-тестирование)
  • омологационные тестеры (вы запрашиваете кучу dist на своей платформе интеграции и выполняете там свои нерегрессионные тесты, тесты производительности, стресс-тесты и т. д.)
  • менеджеры по выпуску продукции ...

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

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

Примечание. Основным преимуществом наличия доставки (dist) в SCM является то, что зависимый проект может работать не с вашими источниками, а напрямую с вашей доставкой (которая связана чтобы перейти в тот или иной момент в производство): если им удастся заставить свой код работать, компилируя с вашей доставкой, скорее всего, их собственный dist, когда развернут с вашим, будет работать.
Таким образом, другие команды получат доступ ваша доставка (ваш myProject.jar), когда они обращаются к любому из своих источников: они могут прочитать через SCM версию вашего jar-файла, его дату, его историю, его метаданные, его метку и т. д.

Однако для одного небольшого монолитного проекта (например, «от него не зависят другие проекты») можно утверждать, что dist (окончательная пакетная поставка) может быть перекомпонован по запросу и сохранен во внешней ссылочной системе < / strong>, например, в качестве внешнего репозитория Maven.
НО: Maven не является репозиторием SCM, что означает, что вам нужно подписать свой jar ('MyProject-1.0.jar'), у вас нет истории, и вам нужно сообщить все ваши метаданные в отдельном текстовом файле вместе с доставкой. Любой другой проект, имеющий доступ к этой доставке в этом репозитории Maven, должен скорректировать свои скрипты и пути к классам в соответствии с вашим соглашением об именах версий.
Кроме того, Maven - это еще один репозиторий в вашей архитектуре разработки. Когда вы можете свести количество репозиториев к минимуму («1»;)), это лучше.

person VonC    schedule 21.10.2008

Простой. Не проверяйте / не входите в систему контроля версий.

В системе контроля версий действительно не должно быть сгенерированного кода / двоичных файлов / jars / what-have-you.

person tunaranch    schedule 21.10.2008

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

Если вы действительно хотите зарегистрировать продукты сборки, скопируйте их в другое место (например, в каталог, называемый «предварительно построенные») и зарегистрируйте их оттуда.

Отредактировано для добавления: Причина, по которой вам не нужно этого делать, заключается в том, что, учитывая текущий источник, вы должны иметь возможность воссоздать дистрибутив с помощью одной команды сборки.

person Mark Bessey    schedule 21.10.2008

Хорошо, спасибо всем. Теперь я понимаю, почему с философской точки зрения не следует строить сборки из SCM, и буду помнить об этом в будущем. Однако практически в данном случае я единственный разработчик этого короткого (4 недели) проекта. Я использую svn, чтобы легко обновить сборку релиза на общедоступном веб-сервере через низкоскоростное соединение, так что дифференциальное обновление имеет важное значение. Поскольку никто не предлагал простой альтернативы обновлению сборок удаленного развертывания, я придумал этот хакерский прием, чтобы избежать своей проблемы:

Скажем, моя версия версии сборки - / dist. Что ж, я приказываю своему сценарию сборки выполнить сборку в / dist-tmp, затем рекурсивно скопировать все файлы из / dist-tmp поверх / dist и, наконец, удалить / dist-tmp.

В моем сценарии сборки Ant было несколько дополнительных строк, и он отлично работает.

Однако в следующий раз я должен убедиться, что на хосте развертывания нет окон, и тогда простой сценарий rsync сделает свое дело, и тогда я могу оставить сборки вне SCM.

@VonC получает отметку в ответ на лучшее объяснение философии.

person dalyons    schedule 21.10.2008

Я согласен с тем, что ставить встроенные продукты в SVN - не очень хорошая практика.

При этом, если у вас есть некоторые требования для этого, которые вы не можете обойти, вы можете использовать одну из более современных систем контроля версий, таких как Git, Bazaar и Darcs (есть и другие, но я использовал эти три).

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

person bjnortier    schedule 14.11.2008