在VSCode任务中定义ProblemMatcher——模式与文档不一致?

3
在VSCode中,我正在尝试创建一个ProblemMatcher来解析我运行的自定义脚本上的错误(如果您感兴趣,这是markdown文件 -> pandoc -> PDF)。很好的VSCode ProblemMatcher文档有一个示例任务,它似乎(对我来说)运行一个命令("command": "gcc")并定义了一个问题匹配器("problemMatcher": {...})。当我在我的tasks.json文件中尝试这样做时,我会得到一个“无法将描述转换为问题匹配器”的错误,这并不是非常有帮助。我检查了tasks.json模式,它清楚地说明:如果执行全局命令,则使用问题匹配器(例如,未定义任何任务)。tasks.json文件可以包含全局problemMatcher属性或tasks属性,但不能同时存在。模式有误吗?如果是这样,我会提出问题。
还是我的代码有问题吗?如果是这样,请指出正确的方向。完整代码(减去注释):
{
  "version": "2.0.0",
  "tasks": [
    {
        "label": "md2pdf",
        "type": "shell",
        "command": "md2pdf",
        "group": {
            "kind": "build",
            "isDefault": true
        },
        "presentation": {
            "reveal": "always",
            "panel": "shared",
            "showReuseMessage": false
        },
        "problemMatcher": {
            "owner": "Markdown",
            "fileLocation": ["absolute", "/tmp/md2pdf.log"],
            "pattern": [
                {
                    // Regular expression to match filename (on earlier line than actual warnings)
                    "regexp": "^Converting:\\s+(.*)$",
                    "kind": "location", 
                    "file": 1
                },
                {
                    // Regular expression to match: "l.45 \msg_fatal:nn {fontspec} {cannot-use-pdftex}" with a preceding line giving "Converting <filename>:"
                    "regexp": "l.(\\d+)\\s(.*):(.*)$",
                    "line": 1,
                    "severity": 2,
                    "message": 3
                }
            ]
        }
    }]
}
3个回答

3
我后来花了更多时间来研究这个问题,并与VSCode团队进行了通信,这导致文档方面的改进
使简单功能正常工作需要两个更改:
  1. 需要使用"command": "/full/path/to/executable"而不仅仅是"executable name"
  2. "fileLocation"与要匹配的文件位置无关,而是关于如何处理任务输出中提到的文件路径。无法指定要匹配的文件,因为它隐含地是编辑器中打开的文件或文件夹。在我的情况下,该设置并不重要。

2
如果你和我一样因为“the description can't be converted into a problem matcher”而来到这里,以下是我所学到的:
如果你的问题匹配器中写着类似于“base”: “$gcc”的内容,那么我认为你正在使用微软的C/C++插件。如果你使用的其他基础不在官方文档网页上列出(搜索“Tasks in Visual Studio Code”),则可能是由插件提供的。
因此,这个错误可能意味着你缺少一个插件。在我的情况下,我试图通过VS Code强大的WSL集成在WSL/Ubuntu上远程运行此任务。我在WSL中安装了C/C++插件并解决了这个错误(转到扩展面板,点击“Install in WSL: ”)。

如果您正在使用ssh进行远程开发,也会出现这种情况。需要在远程安装C++扩展程序。 - TTimo

0

我有一种直觉,你的文件路径可能是错误的。尝试使用类似以下的路径:

"fileLocation": "absolute",

感谢@lucian-wischik的回答。这促使我在下面添加了自己的答案。 - JGC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接