1

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

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

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

PS也欢迎针对整个问题的任何其他选项:)

4

3 回答 3

2

您可以使用内置的 MSBuild 功能在任何条件下创建任何自定义任务以扩展功能:CustomAfterMicrosoftCommonTargetsCustomBeforeMicrosoftCommonTargets

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

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

于 2011-04-19T11:52:35.397 回答
0

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

于 2011-04-19T11:50:33.813 回答
0

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

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

<Import Project="_pathToCommonTargets_" />

导入公共目标后,您可以控制挂钩到构建项目中发生的情况 - 即在该项目上调用“构建”时在特定点发生的可覆盖目标。此外,您可以在通用目标文件中创建新目标,而不是构建目标,以便在 Visual Studio 之外进行构建。

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

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

于 2011-04-19T15:40:09.220 回答