如何根据某些标准检查解决方案中的所有项目?
Posted
技术标签:
【中文标题】如何根据某些标准检查解决方案中的所有项目?【英文标题】:How to check all projects in solution for some criteria? 【发布时间】:2011-08-08 14:18:46 【问题描述】:我需要让解决方案中的所有项目都包含一些额外的构建操作,例如StyleCop 验证、AssemblyInfo 的自动生成等。
我的想法是进行某种解决方案范围的预构建事件,该事件将检查所有项目文件中是否包含与特定 xPath 匹配的节点。这不是一个难点,它可以通过自定义构建任务或一些第三方 Xml 处理任务来解决。我还没有深入研究它,但它肯定不会成为值得在这里提及的问题。
问题是如何 1)用一些自定义任务扩展解决方案文件?它不应该是解决方案的必要组成部分。这是需要的,但在从 VS 构建时可以省略,有一些特定的命令行来执行它就足够了。 2)如果不可能,“Solution-wide pre-build event?”中有描述的选项。它很hacky,但如果没有其他选择,我会使用它。但是如何从解决方案文件中获取项目文件列表?请考虑到包含解决方案的文件夹可能包含不应检查的额外项目文件,因此仅枚举所有 ***.*proj 不是一个选项。
附:也欢迎针对整个问题的任何其他选项:)
【问题讨论】:
【参考方案1】:您可以使用内置的 MSBuild 功能在任何条件下创建任何自定义任务以扩展功能:CustomAfterMicrosoftCommonTargets、CustomBeforeMicrosoftCommonTargets。
见我的example。您可以在 .targets 文件中为构建过程中的每个步骤添加自定义任务。您可以添加条件以打开/关闭这些操作等。它不依赖 sln 文件,但您可以使用条件 '$(BuildingInsideVisualStudio)'=='true' 执行特定于 VS 的任务。您可以从命令行调用它们 - 您需要使用键 /t:MyCustomTarget 指定目标名称。
副作用:如果您的自定义目标没有任何特定条件 - 它将在每个类似项目中调用。
【讨论】:
【参考方案2】:有一种更简单的方法来处理这类事情。您可以使用共享构建 .targets 文件,而不是尝试动态更改项目文件内容,这些文件通过http://msdn.microsoft.com/en-us/library/ms171464.aspx 中描述的机制(在http://msdn.microsoft.com/en-us/library/ms171464.aspx 中还有另一个示例)导入到您的 Visual Studio 项目中。
【讨论】:
可能我的问题并不清楚 - 我已经有共享目标。我只需要检查目标是否已导入:团队很大,项目不是由一个人添加的。例如。我的最后一次检查表明,在我们大约 50 个项目的解决方案中,有 7 个项目没有导入该自定义目标。我想自动执行此检查。【参考方案3】:我从未从解决方案级别处理过这个问题 - 在针对解决方案文件调用 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 节点的子节点)执行操作。
Msbuild 主页:http://msdn.microsoft.com/en-us/library/0k6kkbsd.aspx Msbuild 可覆盖的自定义目标:http://msdn.microsoft.com/en-us/library/aa337604.aspx【讨论】:
再次,我的问题似乎并不清楚:我不需要添加自定义构建目标(或者实际上我这样做了,而且我已经这样做了),我只需要检查是他们已经进口了。这样我也无法检查是否设置了属性 - 所以我将检查未加载的项目。以上是关于如何根据某些标准检查解决方案中的所有项目?的主要内容,如果未能解决你的问题,请参考以下文章