На работе мы разрабатываем крупномасштабное приложение с довольно большим количеством интерфейсных, серверных и вспомогательных компонентов. Обычно внешний интерфейс разрабатывается на C #, а внутренний - на Java, хотя его части также разрабатываются на C # и, возможно, позже на C ++.
Выбор языка и платформы не является произвольным; мы пытаемся взвесить относительные достоинства каждого из них по времени разработки, стоимости цепочки инструментов, знакомству с языком конкретной командой разработчиков и т. д. Однако все эти компоненты объединяет то, что все они необходимы для полной работы продукт, и что они разрабатываются одновременно независимыми (но очень общительными) командами.
Ранее мы использовали Team Foundation Server для нашего кода .NET и Subversion для нашего кода Java; Поскольку было четкое разделение обязанностей команд, это вызвало небольшую проблему, кроме неудобства размещения двоичных файлов (в данном случае WAR-файлов), сгенерированных из одного дерева исходных текстов, в другое, а также высоких накладных расходов на поддержание синхронизации ветвей и версий. С этим проектом степень разделения между командами намеренно намного меньше, и ожидается, что объем ветвления / слияния будет значительно выше; в результате мы переходим к унифицированной VCS, а точнее к Subversion.
Это подводит меня к сути вопроса: как эффективно смешивать код Java и C #? На практике код .NET будет зависеть от кодовой базы Java; двоичные файлы Java требуются для запуска чего-либо, кроме кода модульного тестирования (для интеграционных тестов уже требуются двоичные файлы, и QA, приемочное тестирование и т. д., безусловно, также делают это). То, что мы сейчас имеем в виду, выглядит примерно так:
/trunk
/java
/component1
/component2
/library1
/library2
/net
/assembly1
/assembly2
/...
project.sln
Идея состоит в том, что все дерево исходных текстов находится под одной веткой; код .NET зависит от кода Java, поэтому мы добавим в решение шаг после сборки, который (скорее всего) вызовет сценарий ant для компонентов Java. Это позволяет выполнять разветвление всей кодовой базы (для разработчиков .NET) или только компонентов Java (для разработчиков Java).
Проблемы с этим решением:
-
Что происходит, когда одна из двух кодовых баз становится настолько большой, что ее копирование для каждой ветви становится непрактичным? (наши мысли: разделить на отдельные репозитории для кода .NET и Java и использовать svn: externals, любые входные данные для этого будут значительно приветствуются).
-
Мы используем Eclipse для разработки Java. Как мы управляем «общим» рабочим пространством (т. Е. Какие проекты требуются для каких компонентов, граф зависимостей и т. Д.)? До сих пор у нас было относительно немного Java-компонентов, поэтому каждый разработчик мог одновременно хранить их все в рабочей области. С увеличением количества компонентов Java и разработчиков Java я не понимаю, как мы можем продолжать это делать; какие-либо предложения о том, как сохранить версию рабочей области (в виде файлов решений) при сохранении синхронизации между двумя базами кода?
Мне бы очень хотелось услышать ваше мнение!