Я пишу новую задачу сборки для компиляции 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
У кого-нибудь есть предложения?