Как связать каталоги для VS Code matcher - PullRequest
0 голосов
/ 09 ноября 2018

Я пишу новую задачу сборки для компиляции C ++ в VS Code. Задача включает компиляцию кода внутри контейнера 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 не может найти файлы, в которых есть ошибки сборки. Это потому, что вывод для an выглядит примерно так:

/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, и установить Расположение файла 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

У кого-нибудь есть предложения?

1 Ответ

0 голосов
/ 14 ноября 2018

Похоже, вам просто нужно включить имя контейнера и косую черту: /host/ в регулярное выражение (и трактовать путь как относительный), так что вот так:

Косые черты должны быть экранированы, поэтому вы должны добавить \/host\/ после начала этого регулярного выражения.

Попробуйте этот конфиг, я могу запустить его как задачу (control-shift-B) и генерировать проблемы с ним (control-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, чтобы перейти к коду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...