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

时间:2018-11-09 17:30:51

标签: c++ regex visual-studio-code

我正在编写一个新的构建任务,用于以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容器中打开文件

有人有什么建议吗?

1 个答案:

答案 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消息以跳至代码。