如何为VS Code问题匹配器链接目录

3
我正在为VS Code编写一个新的构建任务,用于编译C++代码。该任务涉及在Docker容器内部编译代码。例如:
docker exec -it my_container make

这是我的task.json文件中的内容。
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "docker",
            "args": [
                "exec",
                "-it",
                "my_container",
                "make"
            ],
            "group": "build",
            "presentation": {
                "reveal": "always",
                "panel": "dedicated"
            },
            "options": {
                "cwd": "${workspaceRoot}"
            },
            "problemMatcher": {
                "base": "$gcc",
                "fileLocation": "absolute"
            }
        }
    ]
}

我能运行任务,一切都编译正确。然而,VS Code无法找到那些有编译错误的文件。这是因为一个的输出如下:

/host/my_project/src/my_file.cpp:105:46: error: passing 'const SomeClass' as 'this' argument discards qualifiers [-fpermissive]

列出的路径是Docker容器中文件的绝对路径。当你在“问题”选项卡中单击其中一个文件时,它会尝试跳转到 /host/my_project/src/my_file.cpp,但该文件不存在。相反,该文件位于 /home/me/projects/my_project/src/my_file.cpp 中。
我尝试了一些方法来解决这个问题,但似乎都不起作用。我尝试将 problemMatcher 更改为 文档 中概述的那个,并尝试使用一个不同的正则表达式来删除路径的绝对部分(例如,将 /host/my_project/src/my_file.cpp 转换为 /src/my_file.cpp,并将 fileLocation 设置为 relative)。然而,我对正则表达式不是很熟悉,无法正确地处理它。参考此处的一些正则表达式,我得出了以下结论。
"problemMatcher": {
    "owner": "cpp",
    "fileLocation": ["relative", "${workspaceFolder}"],
    "pattern": {
    "regexp": "^[^/]/[^/]*/[^/]*/(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
        "file": 1,
        "line": 2,
        "column": 3,
        "severity": 4,
        "message": 5
    }
}

我也尝试了那个答案中的其他选项,但它们都不起作用。我还尝试创建一个文件夹之间的符号链接,通过运行ln -s /host ~/projects。这也没有起作用,并且仍然尝试在Docker容器中打开文件。有人有什么建议吗?

相关:https://stackoverflow.com/questions/47775169/visual-studio-code-problemmatcher-not-working-with-custom-output - Florian Castellane
1个回答

1
看起来你只需要在正则表达式中包含容器名称加斜杠:/host/(并将路径视为相对路径),所以就像这样:
必须转义斜杠,因此你需要在该正则表达式的开头添加\/host\/
尝试使用此配置,我可以将其作为任务运行(控制-Shift-B)并生成问题(控制-Shift-M)。但是它不允许我在控制台中控制单击错误,我猜想需要编辑c++扩展的正则表达式。
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "echoCommand": true,
    "tasks": [
        {
            "label": "build",
            "command": "YOUR BUILD COMMAND HERE",
            "type": "shell",
            "group": "build",
            "presentation": {
                "reveal": "always",
                "panel": "dedicated"
             },
            "options": {
                "cwd": "${workspaceRoot}",
            },
            "problemMatcher": {
                "base": "gcc",
                "fileLocation": ["relative", "${workspaceRoot}"],
                "pattern": {
                    "regexp": "^\/host\/(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        }
    ]
}

然而,终端中的路径检测不受影响。我希望这个正则表达式能让我们通过控制+点击GCC消息跳转到代码。

谢谢!我必须稍微修改\/host\/以匹配我的文件夹结构,但它可以工作。当我在列表中点击问题时,它也会链接回正确的文件。 - TFischer

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