4

我目前正在进行的项目由多个团队开发,每个团队负责项目的不同部分。他们都建立了自己的 C# 项目和解决方案,并使用特定于他们自己需求的配置设置。但是,现在我们需要创建另一个全局解决方案,它将所有项目组合并构建到同一个输出目录中。

我遇到的问题是,我发现只有一种方法可以让所有项目都构建到同一个输出目录中——我需要修改所有项目的配置。这是我们想要避免的。我们希望所有这些项目都不了解这种“全球”解决方案。每个团队都必须保留仅使用自己的子解决方案的可能性。

一种可能的解决方法是仅为此“全局”解决方案为所有项目创建一个特殊配置,但这可能会产生额外的问题,因为现在您必须不断地将此配置设置与该特定团队使用的常规设置同步。我们要做的最后一件事是花几个小时试图弄清楚为什么在全局解决方案下构建时某些东西不起作用,仅仅是因为开发人员在他们的配置中检查了一些复选框,但在全局配置中忘记了这样做。

因此,为简化起见,我们需要某种输出目录设置或构建后事件,这些设置仅在从该全局、包罗万象的解决方案构建时才会出现。有没有办法在不改变项目配置的情况下实现这一点?

更新 1
我想我需要提及一些额外的细节:

我们需要这个全局解决方案尽可能接近最终用户在安装我们的应用程序时获得的结果,因为我们打算在需要确定应用程序的哪个部分不工作时使用它来调试整个应用程序在将此错误发送给从事该部分工作的团队之前。

这意味着在全局解决方案下构建时,输出目录层次结构应该与安装后在 Program Files 中的目录层次结构相同,例如,如果我们有 Program Files/MyApplication/Addins 文件夹,其中包含由开发的所有插件不同的团队,我们需要全局解决方案来从插件项目中复制二进制文件并将它们相应地放置在输出目录中。

问题是,开发插件的团队不需要知道它是插件并且应该放在那个文件夹中,所以他们不能将他们的相对输出目录更改为 build/bin/Debug/Addins。

4

4 回答 4

2

这里的关键是团队负责交付。该可交付成果是二进制文件的集合。因此,“全球”解决方案……或“使用团队可交付成果的产品”有兴趣确保所有“当前可交付成果”协同工作。也就是说,您可以从协作工作中获得可交付成果。

所以这引出了几个问题。团队是否交付了他们认为是“发布”的内容。这在构建系统中可能是自动的。如果它构建并且所有测试都通过然后发布它。

您正在寻找的是一个发布或推广版本的团队。源代码是您到达那里的方式,二进制文件是结果。每个团队控制它认为是发布的二进制文件(这可能由构建系统自动执行)。

不完全是您所问的,但我希望它是导致正确问题的答案,从而产生良好的结果。

于 2012-10-22T09:19:37.850 回答
1

一种非常简单的方法是创建解决方案。包括所有项目并添加一个(或更多)项目来处理全局解决方案构建任务。然后,全局解决方案中的项目应该引用他们需要的项目,然后让 Visual Studio 处理如何从每个项目中获取二进制文件。它们将(在正常情况下)被复制到构建项目的输出文件夹中。因此,专门为全局构建任务添加的项目将拥有所有引用项目的副本

另一种方法是创建一个引用其余构建脚本的全局 MSBuild 脚本。每个项目都有自己的 MSBuild 脚本

编辑

从评论看来,有两类项目。一个需要建设,一个不需要。

对于那些需要构建的人,将它们作为聚合项目中的项目引用,对于那些不需要构建的人,将它们添加为引用或将 dll 作为资源添加。

使用后者将 Build 操作的属性更改为 None 并复制到输出目录以复制(如果较新)

在这两种情况下,您现在都在输出目录中拥有所有 dll,然后您可以对聚合项目执行构建后操作,移动应该位于特定文件夹中的 dll(即不在输出文件夹中)

于 2012-10-22T10:22:16.640 回答
0

看看持续集成的实践和构建服务器与脚本构建的使用。在团队开发应用程序的不同部分时,这是必不可少的工具,您的问题很好地说明了原因。

于 2012-10-22T09:22:06.133 回答
0

您没有提到是否使用版本控制系统。我在实践中发现每个开发人员都维护他/她/他们的团队配置并在该机器上本地构建,因为您不检查 *.suo 或 *.user 文件,大多数个人配置只会影响单个团队成员。

在完全独立的机器上,从所有存储库中签出相同的代码,并在构建机器上编译项目(这可以完全自动化)。这可以保持您的构建服务器的独立性。

不要担心它是一个“解决方案”。您可以一个接一个地轻松构建多个解决方案。

由于输出路径是相对的(可能是“bin\Debug”),它会在您检查它的任何地方构建。如果您希望所有二进制文件都在同一个输出文件夹中,您可以调整每个配置的输出路径以匹配。像“....\bin\Debug”之类的东西(显然这会影响项目在本地机器上的构建位置,但它可能无关紧要)。这样,多个项目将构建相同的目标输出。

您还可以在构建服务器上包含一个单独的设置构建,该构建服务器不在每个开发人员的本地计算机上以打包最终产品。

于 2012-10-22T09:46:25.420 回答