前言
这个问题是起因在我想把代码指向的相对路径更改为使用宏的绝对路径便于编译调试,但是在一次调试过程中有一个编译时报错,点击报错内容项时,却显示找不到路径文件。报错详细内容显示是 即:代码路径+绝对路径。
"resource": "/c:/Users/97852/Desktop/ZryCode/CODE/C++/C:/Users/97852/Desktop/ZryCode/CODE/C++/Processing/IQProcess.cpp",
那么这里的错误就已经很明显了,“现在VS 认为错误的查找路径应当是相对路径,并且拼接格式是 代码路径再拼接编译时路径。”。
接下来就是解决问题需要了解的内容。我从VS的官方帮助手册和开放源码中找到了解决方法,现在整理记录下来。
tasks.json 是什么?
tasks.json是VsCode提供的一种快捷配置文件,用来集中管理 VsCode 的编译调试功能。
VS Code软件会通过 工作区 或者 打开文件夹的当前目录下(这取决于你是否为当前代码项目创建了工作区) 的.vscode 下的 tasks.json配置来为每一次调试,执行对应的相关设置内容。
问题界面是什么?
问题界面如果没有专门设置的话,就是在下方显示的编译调试辅助工具栏显示告警和错误的相关信息。
通过双击对应的问题条目,可以自动跳转到问题所在的代码文件的对应行数。
怎么设定自己的问题界面显示内容?
在 tasks.json中可以设置一个属性名为 problemMatcher ,这个是用来规定问题界面的全部内容的。
而它的子属性有一个名为:fileLocation的就是指的问题界面文件目录的查找方式。也就是此次问题的所在。
这里我们要将代码文件查找方式设定为自适应,并添加非绝对路径时的查找路径。
即将 属性 fileLocation 的 Value值 设定为 autodetect(自适应) "${workspaceRoot}"(这里指定非绝对路径时的查找路径 为工作区根目录)
"problemMatcher": { "owner": "cpp", "fileLocation": [ "autodetect", "${workspaceRoot}" ], "pattern": { "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", "file": 1, "line": 2, "column": 3, "severity": 4, "message": 5 } },
补充
vscode 对于 json 文件的解析方式的开源代码部分.
摘录 文件目录设定部分的说明:
/** * Defines how filename reported in a problem pattern * should be read. Valid values are: * - "absolute": the filename is always treated absolute. * - "relative": the filename is always treated relative to * the current working directory. This is the default. * - ["relative", "path value"]: the filename is always * treated relative to the given path value. * - "autodetect": the filename is treated relative to * the current workspace directory, and if the file * does not exist, it is treated as absolute. * - ["autodetect", "path value"]: the filename is treated * relative to the given path value, and if it does not * exist, it is treated as absolute. */ fileLocation?: string | string[];
全文附注:
The following interfaces define the basic schema of the file.tasks.json Note: Some task options are contributed by VS Code extensions. You can use IntelliSense to find a complete list, using the Trigger Suggestions command (Ctrl+Space).tasks.json interface TaskConfiguration extends BaseTaskConfiguration { /** * The configuration's version number */ version: '2.0.0'; /** * Windows specific task configuration */ windows?: BaseTaskConfiguration; /** * macOS specific task configuration */ osx?: BaseTaskConfiguration; /** * Linux specific task configuration */ linux?: BaseTaskConfiguration; } interface BaseTaskConfiguration { /** * The type of a custom task. Tasks of type "shell" are executed * inside a shell (e.g. bash, cmd, powershell, ...) */ type: 'shell' | 'process'; /** * The command to be executed. Can be an external program or a shell * command. */ command: string; /** * Specifies whether a global command is a background task. */ isBackground?: boolean; /** * The command options used when the command is executed. Can be omitted. */ options?: CommandOptions; /** * The arguments passed to the command. Can be omitted. */ args?: string[]; /** * The presentation options. */ presentation?: PresentationOptions; /** * The problem matcher to be used if a global command is executed (e.g. no tasks * are defined). A tasks.json file can either contain a global problemMatcher * property or a tasks property but not both. */ problemMatcher?: string | ProblemMatcher | (string | ProblemMatcher)[]; /** * The configuration of the available tasks. A tasks.json file can either * contain a global problemMatcher property or a tasks property but not both. */ tasks?: TaskDescription[]; } /** * Options to be passed to the external program or shell */ export interface CommandOptions { /** * The current working directory of the executed program or shell. * If omitted the current workspace's root is used. */ cwd?: string; /** * The environment of the executed program or shell. If omitted * the parent process' environment is used. */ env?: { [key: string]: string }; /** * Configuration of the shell when task type is `shell` */ shell: { /** * The shell to use. */ executable: string; /** * The arguments to be passed to the shell executable to run in command mode * (e.g ['-c'] for bash or ['/S', '/C'] for cmd.exe). */ args?: string[]; }; } /** * The description of a task. */ interface TaskDescription { /** * The task's name */ label: string; /** * The type of a custom task. Tasks of type "shell" are executed * inside a shell (e.g. bash, cmd, powershell, ...) */ type: 'shell' | 'process'; /** * The command to execute. If the type is "shell" it should be the full * command line including any additional arguments passed to the command. */ command: string; /** * Whether the executed command is kept alive and runs in the background. */ isBackground?: boolean; /** * Additional arguments passed to the command. Should be used if type * is "process". */ args?: string[]; /** * Defines the group to which this task belongs. Also supports to mark * a task as the default task in a group. */ group?: 'build' | 'test' | { kind: 'build' | 'test'; isDefault: boolean }; /** * The presentation options. */ presentation?: PresentationOptions; /** * The problem matcher(s) to use to capture problems in the tasks * output. */ problemMatcher?: string | ProblemMatcher | (string | ProblemMatcher)[]; /** * Defines when and how a task is run. */ runOptions?: RunOptions; } interface PresentationOptions { /** * Controls whether the task output is reveal in the user interface. * Defaults to `always`. */ reveal?: 'never' | 'silent' | 'always'; /** * Controls whether the command associated with the task is echoed * in the user interface. Defaults to `true`. */ echo?: boolean; /** * Controls whether the panel showing the task output is taking focus. * Defaults to `false`. */ focus?: boolean; /** * Controls if the task panel is used for this task only (dedicated), * shared between tasks (shared) or if a new panel is created on * every task execution (new). Defaults to `shared`. */ panel?: 'shared' | 'dedicated' | 'new'; /** * Controls whether to show the `Terminal will be reused by tasks, * press any key to close it` message. */ showReuseMessage?: boolean; /** * Controls whether the terminal is cleared before this task is run. * Defaults to `false`. */ clear?: boolean; /** * Controls whether the task is executed in a specific terminal * group using split panes. Tasks in the same group (specified by a string value) * will use split terminals to present instead of a new terminal panel. */ group?: string; } /** * A description of a problem matcher that detects problems * in build output. */ interface ProblemMatcher { /** * The name of a base problem matcher to use. If specified the * base problem matcher will be used as a template and properties * specified here will replace properties of the base problem * matcher */ base?: string; /** * The owner of the produced VS Code problem. This is typically * the identifier of a VS Code language service if the problems are * to be merged with the one produced by the language service * or 'external'. Defaults to 'external' if omitted. */ owner?: string; /** * The severity of the VS Code problem produced by this problem matcher. * * Valid values are: * "error": to produce errors. * "warning": to produce warnings. * "info": to produce infos. * * The value is used if a pattern doesn't specify a severity match group. * Defaults to "error" if omitted. */ severity?: string; /** * Defines how filename reported in a problem pattern * should be read. Valid values are: * - "absolute": the filename is always treated absolute. * - "relative": the filename is always treated relative to * the current working directory. This is the default. * - ["relative", "path value"]: the filename is always * treated relative to the given path value. * - "autodetect": the filename is treated relative to * the current workspace directory, and if the file * does not exist, it is treated as absolute. * - ["autodetect", "path value"]: the filename is treated * relative to the given path value, and if it does not * exist, it is treated as absolute. */ fileLocation?: string | string[]; /** * The name of a predefined problem pattern, the inline definition * of a problem pattern or an array of problem patterns to match * problems spread over multiple lines. */ pattern?: string | ProblemPattern | ProblemPattern[]; /** * Additional information used to detect when a background task (like a watching task in Gulp) * is active. */ background?: BackgroundMatcher; } /** * A description to track the start and end of a background task. */ interface BackgroundMatcher { /** * If set to true the watcher is in active mode when the task * starts. This is equals of issuing a line that matches the * beginPattern. */ activeOnStart?: boolean; /** * If matched in the output the start of a background task is signaled. */ beginsPattern?: string; /** * If matched in the output the end of a background task is signaled. */ endsPattern?: string; } interface ProblemPattern { /** * The regular expression to find a problem in the console output of an * executed task. */ regexp: string; /** * Whether the pattern matches a problem for the whole file or for a location * inside a file. * * Defaults to "location". */ kind?: 'file' | 'location'; /** * The match group index of the filename. */ file: number; /** * The match group index of the problem's location. Valid location * patterns are: (line), (line,column) and (startLine,startColumn,endLine,endColumn). * If omitted the line and column properties are used. */ location?: number; /** * The match group index of the problem's line in the source file. * Can only be omitted if location is specified. */ line?: number; /** * The match group index of the problem's column in the source file. */ column?: number; /** * The match group index of the problem's end line in the source file. * * Defaults to undefined. No end line is captured. */ endLine?: number; /** * The match group index of the problem's end column in the source file. * * Defaults to undefined. No end column is captured. */ endColumn?: number; /** * The match group index of the problem's severity. * * Defaults to undefined. In this case the problem matcher's severity * is used. */ severity?: number; /** * The match group index of the problem's code. * * Defaults to undefined. No code is captured. */ code?: number; /** * The match group index of the message. Defaults to 0. */ message: number; /** * Specifies if the last pattern in a multi line problem matcher should * loop as long as it does match a line consequently. Only valid on the * last problem pattern in a multi line problem matcher. */ loop?: boolean; } /** * A description to when and how run a task. */ interface RunOptions { /** * Controls how variables are evaluated when a task is executed through * the Rerun Last Task command. * The default is `true`, meaning that variables will be re-evaluated when * a task is rerun. When set to `false`, the resolved variable values from * the previous run of the task will be used. */ reevaluateOnRerun?: boolean; /** * Specifies when a task is run. * * Valid values are: * "default": The task will only be run when executed through the Run Task command. * "folderOpen": The task will be run when the containing folder is opened. */ runOn?: string; }
扩展阅读:
Visual Studio Code Tasks 附录
Visual Studio 代码变量参考