如何在解决方案中构建多个项目,每个项目都有不同的目标?

问题描述:

我正在使用具有多个项目(常规程序集,ASP.NET MVC项目,Windows Azure项目和SQL项目)的VS2010解决方案。我想弄清楚如何设置一个TFS构建定义来部署Windows Azure项目和SQL项目。如何在解决方案中构建多个项目,每个项目都有不同的目标?

我知道如何进行Windows Azure部署,并在执行部署的Windows Azure项目文件(.ccproj)中有一个自定义生成任务。我可以轻松创建一个针对.ccproj文件运行的构建定义,并将一些MSBuild命令行参数作为参数传递,并按预期工作。

我可以创建另一个针对SQL项目(.sqlproj)文件运行的构建定义,传递给MSBuild构建和发布SQL项目所需的构建目标和参数。这按预期工作。

作为两个不同的构建定义,我的工作。很简单。

我还没有弄清楚如何将这两个构建定义合并为一个。这甚至可能(没有很多工作)?理想情况下,我可以启动一个新的构建,构建项目并将它们作为单个工作单元的一部分进行部署(就像它们作为单独的构建定义一样)。

我已经使用该解决方案文件作为建项目尝试,并指定创建目标为/吨:<项目>:<目标>; <项目>:<目标>。但是,显然这种语法只适用于基本集合中的目标,而不适用于任何自定义目标或由其他.targets文件导入的目标(或者这是我的理解)。

什么是最好的(最简单的)方式来完成我期待做的事情?

当然你完全可以做到这一点!基本上,你需要在每个项目中有一个同名的目标。然后,您更改每个DependsOn列表以包含项目特定的目标列表。例如:

项目1:

<Target Name="MyBuild" DependsOnTargets="AzureTarget1,AzureTarget2" /> 

项目2:

<Target Name="MyBuild" DependsOnTargets="SQLTarget1,SQLTarget2" /> 

那么你可以告诉构建定义的基础上每个MyBuild目标,它应该调用适当的DependsOn目标。

这是一个非常简单的如何做到这一点的示例,但是如果您还使用MSBuild Traversal项目和MSBuild遍历任务,就可以使其更加健壮,这与下面的文章“Building Large Source Trees“部分:

http://msdn.microsoft.com/en-us/magazine/dd483291.aspx#id0100082