[在工作中,我们正在开发具有大量前端,后端和支持组件的大型应用程序。通常,前端是用C#开发的,后端是用Java开发的,尽管后端的某些部分也是用C#和更高版本的C ++开发的。
语言和平台的选择不是任意的;我们尝试权衡每种工具在开发时间,工具链成本,特定开发团队对语言的熟悉程度等方面的相对优缺点。尽管如此,所有这些组件的共同点是,它们都是完整的操作所必需的产品,并由独立的(但高度沟通)团队同时开发。
[以前,我们将Team Foundation Server用于.NET代码,并将Subversion用于Java代码;因为团队的职责明确分开,所以除了将不方便将源树中生成的二进制文件(在这种情况下为WAR)放置在另一个源树中,以及将分支和修订版本保持同步的高人工开销之外,这没有什么问题。在这个项目中,团队之间的分离度有意要小得多,分支/合并的数量预计会更高。因此,我们正在使用统一的VCS,更具体地说是Subversion。
这使我想到了一个问题:如何有效地混合Java和C#代码?实际上,我们将拥有依赖于Java代码库的.NET代码。 Java二进制文件必须运行除单元测试代码以外的任何内容(集成测试已经需要二进制文件,并且QA,验收测试等当然也需要)。我们目前的想法如下:
/树干/ java/ component1/ component2/图书馆1/ library2/净/ assembly1/ assembly2/ ...project.sln
这个想法是将整个源代码树放在一个分支下; .NET代码取决于Java代码,因此我们将在解决方案中添加一个后构建步骤,该步骤(很可能)将调用Java组件的ant脚本。这允许分支整个代码库(对于.NET开发人员)或仅对Java组件(对于Java开发人员)进行分支。
此解决方案的问题是:
如果代码的一部分紧密依赖于另一部分,则将其保持在一起。更好地在回购中拆分组件。 (这甚至适用于内部结构,在内部结构中,尤其是随着事物的增长,如果您按类型而不是按功能打包,则很难,即在MVC中,每个类别没有三个庞大的包,而是保留FooView,FooModel和FooController紧密。)
svn:externals可能有效,在更高版本中,我认为您可以使用“ internals”,即链接到同一存储库中的其他目录。这比管理单独的存储库要容易得多,尤其是在标记和分支方面。 (颤抖)2:您可以始终让开发人员设置不同的工作区,或者使用工作集。商业Eclipse版本比OS变体更好地支持共享工作区设置。 (还没有尝试过,只对操作系统有效而感到沮丧)
我已经在一个仓库中完成了C ++(MSVS)和Java(Eclipse),并且效果很好。同样,C ++ / Python。确保您的构建系统支持构建和测试所有内容(即使您的IDE仅构建一部分)。