Есть несколько способов справиться с общими вещами.Один из них - скопировать его в хранилище.Это технически известно как The Stinky Bad Way .Причина довольно проста: если вы меняете модуль common для одного места, но не делаете это в других местах.Через некоторое время у вас больше не будет общих .
В Subversion вы можете использовать svn: externals для автоматического импорта общий код в каталогах.Технически это называется В зависимости от запатентованного механизма управления кодом, который работает не так хорошо .Я пытался использовать svn:externals
в течение многих лет, и никогда не работал так, как я хочу.Проблема в том, что когда я отмечаю мой код или создаю ветку, мои ссылки svn: external не перемещаются автоматически.
Например, представьте, что я зависим от общего проекта, хранящегося вhttp://repos/svn/common
.Поскольку в моем проекте требуются общие изменения, мы решили создать общую ветку 2.1 в http://repos/svn/common/branches/2.1
, и мой svn:externals
укажет на это.После того, как я закончу вносить изменения, я сначала должен создать тег http://repos/svn/common/
tags /2.0
в общем достоянии, затем я должен изменить свой svn:external
, чтобы он указывал на этот новый URL, а затем, наконец, создать свойтег в моем проекте.И, если я буду зависеть от десятков общих проектов, я буду отслеживать десятки этих внешних объектов.
Лучший способ - это рассматривать ваши общие зависимости как предварительно скомпилированные сторонние библиотеки.Если вы используете Java, они станут .jar
файлами.Если вы используете C ++, они станут *.so
или *.dll
.Затем вы сохраняете эти скомпилированные объекты в репозитории релизов, и во время процесса сборки вы можете выбрать правильную версию этих зависимостей в каждом проекте.
Хорошая новость заключается в том, что уже существует надежная технология с открытым исходным кодом, котораяделает это, так что вам не нужно ничего придумывать.Плохая новость заключается в том, что это Maven.
Однако, даже если вы не магазин Java, или вы используете Ant вместо Maven, вы все равно можете использовать тот же механизм, который Maven использует, чтобы вытащить свой общий пре.-компилированные зависимости.
Вам необходимо использовать программный пакет репозитория Maven, например Nexus или Artifactory .Если вы не являетесь магазином Java, вы не подключаете эти репозитории к внешнему миру.Просто используйте их для хранения своих выпусков.
В процессе сборки вы загружаете зависимости, используя либо стандартный wget
или curl
, либо Ivy, если вы используете Ant, либо если вы используете Maven, Mavenобрабатывает это автоматически.
Чтобы загрузить артефакты во время сборки, вы можете использовать плагин Maven deploy:deploy-file
.
Этот последний способ сложнее всего настроить, но он того стоит.Теперь вы знаете свои зависимости и версию этой зависимости.У вас также есть все, что хранится только один раз в вашем исходном хранилище, так как вы не копируете весь источник.И, в любом случае, скомпилированный код не должен храниться в вашем репозитории.
Ответ Робу Нейперу
+ 1 для отличного обсуждения, но предупреждение: использование предварительно собранногоОбъектные файлы очень сложны, когда все части разрабатываются одновременно.Это хорошо работает, когда эти файлы .jar / .so / .dll достаточно стабильны и статичны, и в некоторой степени, когда их поддерживают специальные группы.Но если вы разрабатываете все части вместе, и ваша команда не решительно настроена на повторное использование, мой опыт показывает, что Stinky Bad Way - это то, что по-прежнему работает лучше всего для кода, который сильно меняется.Облегчите лучшее повторное использование с частями, которые очень редко меняются, а затем расширяйте повторное использование по мере того, как вы учитесь и взрослеете.- Роб Нейпир
Sticky Bad Way (SBW) - самый простой способ сделать компоненты. Это особенно верно, если вы создаете свой компонентный код во время создания программ, которые используют этот код. Проблема в том, что написание исходной программы занимает всего 10% от программирования. Остальные 90% поддерживают эту программу и следят за тем, чтобы она оставалась актуальной. Это самая сложная часть программирования.
Представьте себе, если я решу использовать сервис Amazon S3 для хранения, и я напишу то, что вы могли бы назвать API или драйвером для работы между моей программой и S3. Допустим, вы называете его Пакет Foundation , и все ваши программы будут его использовать.
Самое простое, что нужно сделать - это SBW - просто скопируйте код Foundation в каждый модуль. Если есть проблема или модуль нуждается в новой функции, которой нет в Foundation , я могу просто изменить Foundation, пока он не сделает то, что я хочу.
Это отлично работает в течение нескольких лет. Затем Amazon объявляет о новом API, и этот старый API устареет. Мало того, новый API имеет функции, которые нужны вашим клиентам. Теперь у вас есть проблема.
У вас есть эта проблема, потому что у этого Foundation нет реального владельца. Отдельные команды разработчиков никогда не занимали время, чтобы изучить код. Если произошли изменения, они использовали метод развития HAIUIW 1 . Теперь у вас есть полдюжины отдельных и несовместимых Foundation модулей, которые никто на самом деле не понимает.
SBW не является проблемой, если ваши разработчики с самого начала понимают, что код, который они используют, не является общим модулем , а является частью их кода. Они узнают, как это работает, и используют его как таковой. Но вы не получите преимуществ от наличия общего модуля.
В программировании 10% включают в себя написание этого первого бита кода. Остальные 90% пытаются сохранить этот код. Мы давно узнали, что мы пытаемся найти ошибки как можно раньше, когда мы кодируем. Во многих парадигмах программирования мы учимся сначала писать тесты и документацию, а затем код. Это сложно и не весело. Это делает первые 10% действительно очень сложными. Я мог бы написать это через пару дней, но теперь я провожу пару недель, делая все это , думая .
Тем не менее, мы знаем, что это значительно облегчает выполнение остальных 90% нашей работы по программированию. То же самое относится и к компонентам. Это так легко скопировать код из одного места в другое и HAIUIT. Гораздо сложнее создать отдельный компонент с собственной командой. Эта команда должна работать с другими командами разработчиков. Будут споры, конфликты и крики спичек. Люди будут называть друг друга именами. У каждой группы свои цели. Теперь представьте, что вы делаете это, пытаясь настроить репозиторий релизов и создать всю инфраструктуру, чтобы все заработало. Эти первые 10% действительно сложно сделать.
Но когда Amazon делает это объявление для своего нового API, или вы обнаружите, что вы могли бы значительно увеличить продажи, если бы вы могли заставить свое программное обеспечение работать и с Microsoft Azure, делая этот отдельный компонент намного проще, а остальные 90% - гораздо проще. .
1 Хак, пока он не работает.