如何根据某些标准检查解决方案中的所有项目?

时间:2011-04-19 11:10:30

标签: visual-studio msbuild stylecop assemblyinfo

我需要让解决方案中的所有项目都包含一些额外的构建操作,例如StyleCop验证,AssemblyInfo的自动化等等

我的想法是制作某种解决方案范围的预建事件,它将检查所有项目文件以包含与特定xPath匹配的节点。这不是一个难点,可以通过自定义构建任务或某些第三方Xml处理任务来解决。我没有深入研究它,但它绝对不会在这里提出一个值得提及的问题。

问题是如何
1)使用一些自定义任务扩展解决方案文件?它不应该是解决方案的必要组成部分。这是可取的,但是从VS构建时可以省略,只需要一些特定的命令行来执行它 2)如果不可能,则在“Solution-wide pre-build event?”中描述选项。这很hacky,但如果没有其他选择,我会用它。但是如何从解决方案文件中获取项目文件列表?请注意,包含解决方案的文件夹可能包含不应检查的额外项目文件,因此只需枚举所有***。* proj不是一个选项。

P.S。对整个问题的任何其他选择也是受欢迎的:)

3 个答案:

答案 0 :(得分:2)

您可以使用内置的MSBuild功能创建任何具有任何条件的自定义任务来扩展功能: CustomAfterMicrosoftCommonTargets CustomBeforeMicrosoftCommonTargets

查看我的example。您可以在.targets文件中为构建过程中的每个步骤添加自定义任务。您可以添加条件来打开/关闭这些操作等等。它不依赖于sln文件,但你可以拥有VS特定的任务,条件为'$(BuildingInsideVisualStudio)'=='true'。您可以从命令行调用它们 - 您需要使用键 / t:MyCustomTarget 指定目标名称。

Sideeffects:如果您的自定义目标没有任何特定条件 - 它将在每个类似项目中调用。

答案 1 :(得分:0)

有一种更简单的处理此类事情的方法。您可以使用通过http://msdn.microsoft.com/en-us/library/ms171464.aspx中描述的机制(http://msdn.microsoft.com/en-us/library/ms171464.aspx处的另一个示例)导入Visual Studio项目的共享构建.targets文件,而不是尝试动态更改项目文件内容。< / p>

答案 2 :(得分:0)

我从来没有从解决方案级别解决这个问题 - 在针对解决方案文件调用msbuild时,您没有很多控制权。

相反,我通常通过让解决方案中的每个项目导入另一个包含所有常见目标的msbuild文件来解决这个问题。这为您提供了对每个项目将要执行的操作的大量细粒度控制,因为您提到解决方案中的每个项目都不需要执行所有额外任务。

<Import Project="_pathToCommonTargets_" />

导入公共目标后,您可以控制钩子进入构建项目时会发生什么 - 即在该项目上调用“Build”时在特定点发生的可覆盖目标。此外,您可以在公共目标文件中创建新目标,而不是构建目标,以便在Visual Studio外部构建时创建新目标。

<Target Name="AfterBuild" >
  <!-- Other tasks here -->
  <!-- Calling a common target -->
  <CallTarget Target="_commonTargetName_" />
</Target>

另外,我不建议使用像XPath这样的东西来确定每个项目文件中的节点。使用msbuild中包含的功能会更加清晰。例如,您可以检查属性是否已设置(propertyGroup节点的子节点)并对集合执行操作(itemGroup节点的子节点。)