我正在编写一个新的构建任务,用于以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无法找到其中包含构建错误的文件。那是因为a的输出看起来像这样:
/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
更改为documentation中概述的内容,并尝试使用其他正则表达式删除路径的绝对部分(例如,将/host/my_project/src/my_file.cpp
转换为/src/my_file.cpp
,并将fileLocation设置为relative
)。但是,我对regex不够精通,无法正确使用。引用here的一些正则表达式,我想到了这个
"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容器中打开文件
有人有什么建议吗?
答案 0 :(得分:1)
看起来您只需要在正则表达式中包含容器名称和斜杠:\/host\/
(并将路径视为相对路径),所以去了:
必须将斜杠转义,因此必须在该正则表达式的开头添加{
// 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
}
}
}
]
}
。
尝试此配置,我可以将其作为任务运行(control-shift-B)并对其产生问题(control-shift-M)。但是,它不允许我按Control键单击控制台中的错误,我想可能需要为此编辑c ++扩展的正则表达式。
class connectStrava extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
btnStrava.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent getStravaApi= new Intent(ImportAPI.this,StravaSetupApi.class);
startActivity(getStravaApi);
}
});
}
@Override
protected String doInBackground(String... aurl) {
//GET ACCESS TOKEN FROM STRAVAS AUTHORIZE ACCOUNT
String accessToken = StravaAuthenticateActivity.getStravaAccessToken(ImportAPI.this);
stravaToken=accessToken; //make static var so i can use it anywhere i want
//Get athletes activities from GetStravaAthleteActivities.java
new GetStravaAthleteActivities.AthleteActivities();
return stravaToken;
}
protected void onProgressUpdate(String... progress) {
Log.d("ANDRO_ASYNC",progress[0]);
}
@Override
protected void onPostExecute(String result) {
//check if token is null so i can display the tick and also disable the button press
if(stravaToken!=null)
{
btnStrava.setEnabled(false);
tickStrava.setVisibility(View.VISIBLE);
}
else {
tickStrava.setVisibility(View.INVISIBLE);
}
}
但是,终端中的路径检测不受影响。我希望此正则表达式可以让我们控制并单击GCC消息以跳至代码。