最近在国产操作系统上使用Visual Studio Code的任务配置,发现tasks下的问题匹配器problemMatcher公开资料很少或很简单,直接在某度上通过problemMatcher
搜索基本上没有精确匹配的信息,为此老猿决定仔细研究一下相关内容。
在 VS Code 中,tasks.json 文件中的 problemMatcher 字段用于定义如何解析任务输出中的问题(错误、警告等)。
problemMatcher是一个描述问题匹配器的接口,配置VS Code中的问题匹配规则,用于在VS Code中处理和显示问题。问题匹配器可以根据指定的模式匹配问题,将其转换为VS Code可以理解的格式,并且可以通过单击问题列表中的问题来跳转到源代码中的相应位置。
下面是vscode中编译一个hello.cpp文件的警告信息输出截图:
但这只是执行编译的信息输出,并不是问题匹配器控制的输出,问题匹配器控制的输出在问题这个输出面板,如图:
通过点击该面板中的问题面板的输出记录才会定位到对应的问题代码。
问题匹配器problemMatcher的类型为ProblemMatcher,vscode官方定义如下:
interface ProblemMatcher {
/**
* The name of a base problem matcher to use. If specified the
* base problem matcher will be used as a template and properties
* specified here will replace properties of the base problem
* matcher
*/
base?: string;
/**
* The owner of the produced VS Code problem. This is typically
* the identifier of a VS Code language service if the problems are
* to be merged with the one produced by the language service
* or 'external'. Defaults to 'external' if omitted.
*/
owner?: string;
/**
* A human-readable string describing the source of this problem.
* E.g. 'typescript' or 'super lint'.
*/
source?: string;
/**
* The severity of the VS Code problem produced by this problem matcher.
*
* Valid values are:
* "error": to produce errors.
* "warning": to produce warnings.
* "info": to produce infos.
*
* The value is used if a pattern doesn't specify a severity match group.
* Defaults to "error" if omitted.
*/
severity?: string;
/**
* Defines how filename reported in a problem pattern
* should be read. Valid values are:
* - "absolute": the filename is always treated absolute.
* - "relative": the filename is always treated relative to
* the current working directory. This is the default.
* - ["relative", "path value"]: the filename is always
* treated relative to the given path value.
* - "autodetect": the filename is treated relative to
* the current workspace directory, and if the file
* does not exist, it is treated as absolute.
* - ["autodetect", "path value"]: the filename is treated
* relative to the given path value, and if it does not
* exist, it is treated as absolute.
* - "search": performs a deep (and, possibly, heavy) file system
* search within the directories.
* - ["search", {include: ["${workspaceFolder}"]}]: performs
* a deep search among the directories given in the "include" array.
* - ["search", {include: ["${workspaceFolder}"], exclude: []}]:
* performs a deep search among the directories given in the "include"
* array, excluding those named in the "exclude" array.
*/
fileLocation?: string | string[] | ['search', { include?: string[]; exclude?: string[] }];
/**
* The name of a predefined problem pattern, the inline definition
* of a problem pattern or an array of problem patterns to match
* problems spread over multiple lines.
*/
pattern?: string | ProblemPattern | ProblemPattern[];
/**
* Additional information used to detect when a background task (like a watching task in Gulp)
* is active.
*/
background?: BackgroundMatcher;
}
下面我们逐一解释ProblemMatcher的各个元素。
字符串类型,将其英文注释翻译一下:要使用的基本问题匹配器的名称。如果指定基本问题匹配器将用作模板,此处指定的属性将替换基本问题匹配程序的属性。
具体的意思,老猿理解好比如C++中的父类和子类一样的关系,但经老猿测试,无法使用自定义的问题匹配器作为基本问题匹配器,但可以使用类似“$gcc”这样的预定义问题匹配器。
下面是老猿测试的一个问题匹配器,用于匹配C++输出的note信息,将其作为warning信息输出:
{"base":"$gcc",
"owner": "problem_note",
"source":"C++",
"severity": "warning",
"pattern":
{
"regexp": "^(.*):(\\d+):(\\d+):\\s+(note):\\s+(.*)$",
}
}
可以看到这个问题匹配器没有配置各个匹配组号与输出信息的对应关系。
字符串类型,按照官方文档的英文注释,意思为:生成的VS代码问题的所有者。如果问题要与开发语言提供内容或“external”产生的问题合并,这通常是VS代码语言服务的标识符。如果省略,则默认为“external”。
这样可以避免不同任务输出的问题混淆在一起。例如,如果有两个任务 A 和 B,它们都会输出一些错误和警告信息。
老猿通常用于将其标识为配置的问题匹配器的名称,在问题面板输出问题的“源”这一列显示,这种理解与上面的注释不符合,但老猿没有看到配置问题匹配器名称的地方,又只有这个可以区分问题来源于哪个问题匹配器,因此就这样理解了。如果不指定 owner 属性,那么问题面板中会将所有问题视为来自同一个问题匹配器,混合在一起显示在“问题”面板中。但如果为任务 A 指定 owner 属性为“taskA”,为任务 B 指定 owner 属性为“taskB”,那么问题将被正确地归类并显示在“问题”面板中。
字符串类型,一个认为标记的可读信息串,用于描述问题的来源,一般用于标记开发语言的类型,感觉没啥用途。
字符串类型,用于描述问题匹配器匹配问题的严重程度,包括三种取值 “error”、“warning”、“info”,更多内容请参考老猿在CSDN的博文《VSCode任务tasks.json中的问题匹配器problemMatcher和ProblemPattern的severity属性关系》。
fileLocation可以是一个字符串、字符串数组或一个包含include和exclude属性的对象,用于设置哪些文件参与问题匹配处理。fileLocation可以有以下取值:
字符串类型,表示问题匹配模式,详细内容请参考老猿在CSDN的博文《VSCode任务tasks.json中的问题匹配器problemMatcher的问题匹配模式ProblemPattern详解》的介绍。
其类型为BackgroundMatcher,用于检测后台任务(如Gulp中的监视任务)何时处于活动状态的附加信息。
BackgroundMatcher是VS Code中的一个后台任务匹配器,它有activeOnStart、beginsPattern、endsPattern三个属性,具体含义如下:
关于BackgroundMatcher,老猿暂时没进行详细测试研究,以后如果研究了再单独介绍。
本文详细介绍了VSCode任务的问题匹配器problemMatcher的用途以及详细配置项,通过了解这些知识,有助于更好地使用vscode。
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
更多关于vscode使用方面的问题的内容请参考专栏《国产信创之光》的相关文章。
前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。