【问题标题】:How to access build warnings in a post-build event in Visual Studio?如何在 Visual Studio 的构建后事件中访问构建警告?
【发布时间】:2017-01-17 08:23:49
【问题描述】:

一般任务。我的任务是,如果存在这样的 DLL,而这些 DLL 没有找到,因此没有被复制到输出文件夹,那么(一组 C# 项目的)构建就会失败。似乎相应的警告不是编译器的警告,因此我无法为 Visual Studio 中的“将警告视为错误”选项提供警告代码。我发现的解决方法是使用 MsBuild,就像在 here 中描述的那样。但是我仍然找不到任何使用 Visual Studio 构建的解决方案。

问题。有没有办法在 Visual Studio 的构建后事件中获取构建日志,尤其是构建警告,并在存在某些确切警告时使构建失败?

我看到了什么。看了here,但建议的宏不是一个方便的解决方案。 根据thisthisVisual Studio 不会为 C# 项目保存构建日志。

更具体。我被要求提供有关我想要出错的特定警告的信息。这是“MSB3245:无法解析此引用。无法找到程序集...”

【问题讨论】:

  • 您是否考虑过创建一个在构建之后运行的 msbuild 目标,扫描丢失的 dll 并在出现问题时引发错误?或者,如果您编辑答案并对被视为错误的条件更加具体,例如添加一个实际示例,有人可以提出适当的解决方案吗?
  • @stjin 感谢您的建议。我怎么知道丢失了哪些文件?如果我有权访问构建日志,我可以捕获带有特定代码或消息的警告。但在其他情况下......我应该分析项目文件(csproj)的结构并将参考信息与位于输出文件夹中的 DLL 进行比较吗?更新了答案;我想赶上 MSB3245。
  • 这是一个常见问题解答,规范 Q+A is here,MSBuild 问题 is here。所以不,解决真正的问题。
  • @HansPassant 谢谢,我看过这些页面。我想真正的问题是项目引用的配置不一致导致运行时异常(因为找不到所需的 DLL)。因此,现在我看到解决此问题的方法很少:1)在 MSB3245 的情况下构建过程失败,2)在比较项目文件结构和输出文件夹文件(如 stjin 建议的那样)后,构建过程失败。
  • Hans 的建议是解决真正的问题,而不是诊断。还有另一种方法可以将该警告变成一个硬错误顺便说一句:添加一个运行您的程序的构建后:]。但同样,这并没有修复太多。

标签: c# visual-studio msbuild


【解决方案1】:

您可以检查 AfterBuild 目标中的文件。例如:

<Target Name="AfterBuild">
    <Error Condition="Exists('$(MSBuildProjectDirectory)\bin\Debug\ClassLibrary1.pdb')==false" Text="file not exist"/>
  </Target>

【讨论】:

  • 感谢您的回复。您的解决方案意味着分析项目文件中的引用(或将它们硬编码到此类条件属性中)。由于逻辑重复,我尽量避免这种情况:如果工具(MsBuild/Visual Studio)识别出问题,那么最好利用这个识别过程而不是创建另一个。然而,越来越清楚的是,这种重复是不可避免的。
  • 由于它不生成构建日志文件,要获取详细的构建日志,需要使用自定义记录器,但Visual Studio没有指定msbuild参数的功能,所以需要直接使用带有 logger 参数的 MSBuild 命令。另一方面,您可以在 post 事件中检查文件。 geekswithblogs.net/dchestnutt/archive/2006/05/30/80113.aspx
  • 感谢您的澄清。
  • @Hoborg 那么,你最后的方法是什么?您可以做出结论并发布答案。
【解决方案2】:

我被要求发布对当前问题的讨论和我公司的经验的结论。就是这样。

回答。对于托管代码项目,没有办法“在 Visual Studio 中的构建后事件中访问构建警告”(不包括一些非常具体的情况,请参阅关于 TFS 的建议)。

解决方法。目前,我们使用 MsBuild 来捕获警告并将其转换为错误,如 here 所述。因此,开发人员在使用标准 Visual Studio(或 ReSharper)构建过程时无法访问此功能。然而,我们的持续集成服务器完全使用 MsBuild,因此它会通知我们我们感兴趣的警告和错误。

其他注意事项

  1. 如果引入了 "Treat warnings as errors" functionality in MsBuild,则可以将其用于类似目的。
  2. 可以创建一个特殊的 MsBuild 任务来分析项目文件 (.csproj) 中的引用,并将这些引用与复制到输出文件夹的文件进行比较。此任务必须注入到每个必要的项目文件中。
  3. TFS 的某些组件可能会保存构建日志(对此不熟悉)。

【讨论】:

  • 您可以在 24 小时后将其标记为答案。另一方面,使用 TFS 构建系统,您可以指定 MSBuild 参数,它还支持继续集成构建 (visualstudio.com/docs/build/get-started/dot-net),因此您只需指定自定义记录器 MSBuild 参数并将自定义任务添加到项目文件 (csproj) 即可实现你的要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 2011-03-25
相关资源
最近更新 更多