当前位置: 首页 > news >正文

如何在 MSBuild Target(Exec)中报告编译错误和编译警告

我曾经写过一篇文章 如何创建一个基于命令行工具的跨平台的 NuGet 工具包,通过编写一个控制台程序来参与编译过程。但是,相比于 基于 Task 的方式,可控制的因素还是太少了。

有没有什么办法能够让控制台程序也能与 MSBuild Target 之间发生更多的信息交换呢?比如报告编译错误和编译警告?答案是有的,通过格式化控制台输出。


本文内容

    • 编译错误和编译警告
    • 更复杂的错误和警告控制
    • 阻止编译错误和编译警告的格式化识别

编译错误和编译警告

MSBuild 的 Exec 自带有错误和警告的标准格式,按照此格式输出,将被识别为编译错误和编译警告。

而格式只是简简单单的 error: 开头或者 warning: 开头。冒号前面也可以加上空格。

using System;

namespace Walterlv.Demo
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Console.WriteLine("warning: walterlv 最好是一个逗比。");
            Console.WriteLine("error: walterlv 必须是一个逗比。");
        }
    }
}

对于这样一段在编译期间执行的程序,编译时将显示如下信息,并产生编译错误和编译警告。

在这里插入图片描述

当然,在这个例子中,我直接在编译完成后执行自己,产生了这样的编译错误。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net47</TargetFramework>
  <Target Name="PostBuild" AfterTargets="PostBuildEvent">
    <Exec Command="$(OutputPath)$(AssemblyName).exe" />
  </Target>
</Project>

更复杂的错误和警告控制

实际上,上面的 warningerror 只是省略的格式,而完整的部分是这样的:

file_path(line_start,column_start,line_end,column_end): error_or_warning key: message
  • file_path 是文件的绝对路径或相对于项目文件的路径,这样的输出之后在 Visual Studio 中双击之后可以定位到文件。
  • line_start、column_start、line_end、column_end 控制双击之后选中文件的开始和结束行列。
  • error_or_warning 可选为 error 或者 warning。
  • key 是一个唯一标识符,如果用户认为可以忽略这样的错误,则可以使用这个唯一的 key 来禁止某一特定项的警告。
  • message 则是普通的消息提示内容。
Demo.cs(344,59,344,78): warning CS0067: The event 'WalterlvClass.Foo' is never used.

阻止编译错误和编译警告的格式化识别

当然,有可能你只是需要一个 error: 开头或者 warning: 开头的格式,并不希望真的产生编译错误或者编译警告,那么只需要在执行 Exec 的时候设置 IgnoreStandardErrorWarningFormat="True"

<Exec IgnoreStandardErrorWarningFormat="True" Command="$(OutputPath)$(AssemblyName).exe" />

参考资料

  • Exec task and “error :” in output

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • 将 .NET Core 项目打一个最简单的 NuGet 源码包,安装此包就像直接把源码放进项目一样
  • 使用 LINQ to XML,.NET 让生成 XML 文件变得和直接写 XML 一样轻松
  • git subtree 不断增加的推送时间,解不玩的冲突!这篇文章应该能救你
  • 阻止某个 NuGet 包意外升级
  • 解读 Microsoft.NET.Sdk 的源码,你能定制各种奇怪而富有创意的编译过程
  • 在 Visual Studio 的解决方案资源管理器中隐藏一些文件
  • 长期支持 LTS(Long-term Support)是怎样的一种支持方式
  • .NET Standard 的管理策略
  • 如何在 .NET/C# 代码中安全地结束掉一个控制台应用程序?通过发送 Ctrl+C 信号来结束
  • Windows 10 应用创建模糊背景窗口的三种方法
  • 使用 PInvoke.net Visual Studio Extension 辅助编写 Win32 函数签名
  • 程序员与英语:即时聊天中的英语缩写 lol / lmao / idk
  • 使用 IFTTT 做 RSS 的邮件订阅服务
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • 语法高亮不够漂亮?这里有你想要的 Rouge 主题
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • ➹使用webpack配置多页面应用(MPA)
  • CentOS从零开始部署Nodejs项目
  • C学习-枚举(九)
  • exports和module.exports
  • express + mock 让前后台并行开发
  • Java|序列化异常StreamCorruptedException的解决方法
  • python docx文档转html页面
  • 坑!为什么View.startAnimation不起作用?
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 通信类
  • 延迟脚本的方式
  • 在weex里面使用chart图表
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​人工智能书单(数学基础篇)
  • #ifdef 的技巧用法
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #QT(智能家居界面-界面切换)
  • #微信小程序(布局、渲染层基础知识)
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (2020)Java后端开发----(面试题和笔试题)
  • (23)Linux的软硬连接
  • (二)linux使用docker容器运行mysql
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (算法)求1到1亿间的质数或素数
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .equals()到底是什么意思?
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .net 怎么循环得到数组里的值_关于js数组
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .NET学习全景图
  • ::什么意思
  • @Valid和@NotNull字段校验使用
  • [ 蓝桥杯Web真题 ]-布局切换