是否可以根据特定的文件扩展名构建任务?

Is it possible to build task based on the specific file extension?

具体来说,我想要一个键盘快捷键来使用正确的编译命令和标志构建可执行文件,无论源文件是 .c 还是 .cpp

比如我现在的任务文件,编译了.cpp个文件,如下:

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++-9 build active file",
            "command": "/usr/bin/g++",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "Task generated by Debugger."
        }
    ]
}

我注意到如果我将 "commands" 更改为 "/usr/bin/gcc",它可以编译 .c 文件。

所以我想让我的任务文件做的是:

  1. 提取我正在构建的文件的扩展名(.c.cpp)。
  2. 设置将提供给 "command" 的变量。
  3. 根据提取的扩展名,有条件地将变量更改为 "/usr/bin/gcc""/usr/bin/g++"

这一切都可能吗?你有更好的建议来实现那种有条件的建筑吗?

谢谢!

您可以使用扩展名 Command Variable

使用命令:extension.commandvariable.file.fileAsKey

扩展的顺序很重要。

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++ build active file",
            "command": "${input:pickCompiler}",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
             ...
             ...
        }
    ],
    "inputs": [
      {
        "id": "pickCompiler",
        "type": "command",
        "command": "extension.commandvariable.file.fileAsKey",
        "args": {
          ".cpp": "/usr/bin/g++",
          ".c": "/usr/bin/gcc"
        }
      }
    ]
}