delphi 如何在VSCode任务错误中配置文件路径

xoefb8l8  于 2022-12-12  发布在  Vscode
关注(0)|答案(2)|浏览(230)

我在VSCode中配置了一个任务来编译 Delphi 2005 DPK。它正在工作并在“问题视图”上返回错误,但它没有在文件中显示错误。
我认为发生这种情况是因为当我单击错误时,我会收到错误消息:
无法打开文件“sx.pas.cn”:未找到文件(...项目文件夹\sr075pro.pas)
但文件在...projectfolder\webservices\sr075pro.pas中。
我找不到方法告诉任务文件位于子文件夹中。我尝试在“fileLocation”标记上使用“relative”选项,但没有成功。
返回错误:

Compiling sa_webservices...
Borland Delphi  Version 13.0  Copyright (c) 1983,99 Inprise Corporation
sr075pro.pas(99) Error: Undeclared identifier: 'ni'
sa_webservices.dpk(802) Fatal: Could not compile used unit 'sr075pro.pas'

我的任务配置:

{
  "version": "0.1.0",
  "name": "Compilar",
  "command": "C:\\Compilers\\compile.bat",
  "suppressTaskName": true,
  "isShellCommand": true,
  "isBuildCommand": true,
  "tasks": [
{
      "taskName": "Compile sa_webservices",
      "isBuildCommand": false,
      "isTestCommand": false,
      "showOutput": "always",
      "args": [
        "sa_webservices"
      ],
      "problemMatcher": {
        "owner": "external",
        "fileLocation": "relative",
        "pattern": {
          "regexp": "^([\\w]+\\.(pas|dpr|dpk))\\((\\d+)\\)\\s(Fatal|Error|Warning|Hint):(.*)",
          "file": 1,
          "line": 3,
          "message": 5
        }
      }
    }

我的编译器.bat:

@echo off
@P:
@set arg1=%1
shift

...
if "%arg1%" == "sa_webservices" set arg2="webservices" 
...
echo Compiling %arg1%...
cd\%arg2% 
dcc32.exe -H -W -Q %arg1%.dpk
hs1ihplo

hs1ihplo1#

你的任务配置是错误的。首先你没有关闭所有的括号,但我猜这是一个错误,复制粘贴到这里的StackOverflow。否则任务配置将无法工作。
现在来谈谈真实的的问题:DCC32会产生包含相对档案路径的提示和警告。这些路径是相对于项目档。在您的工作组态中,您可以设定

"fileLocation": "relative"

Visual Studio程式码不知道如何从编译器消息所提供的相对路径建置正确的绝对路径。因此它猜测您目前的${workspaceRoot}(在您的案例中是projectfolder)会是绝对路径。
这就解释了为什么您会看到包含错误文件路径的错误和警告。为了获得正确的路径,您需要告诉VSCode * 正确的 * 路径,以便合并相对路径。您只需将正确的路径添加到tasks.json中的fileLocation项即可:

"fileLocation": ["relative", "${workspaceRoot}\\webservices"]

整个tasks.json看起来像这样:

{
    "version": "0.1.0",
    "name": "Compilar",
    "command": "C:\\Compilers\\compile.bat",
    "suppressTaskName": true,
    "isShellCommand": true,
    "isBuildCommand": true,
    "tasks": [
        {
            "taskName": "Compile sa_webservices",
            "isBuildCommand": false,
            "isTestCommand": false,
            "showOutput": "always",
            "args": [
                "sa_webservices"
            ],
            "problemMatcher": {
                "owner": "external",
                "fileLocation": ["relative", "${workspaceRoot}\\webservices"],
                "pattern": {
                    "regexp": "^([\\w]+\\.(pas|dpr|dpk))\\((\\d+)\\)\\s(Fatal|Error|Warning|Hint):(.*)",
                    "file": 1,
                    "line": 3,
                    "message": 5
                }
            }
        }
    ]
}
k5ifujac

k5ifujac2#

在vscode 1.74中的problemMatcher中查找文件可能更容易,请参见文件位置搜索:v1.74发行说明. fileLocation属性有一个新选项search

以前,问题匹配器需要通过fileLocation属性准确地知道在哪里查找有问题的文件。支持的方法有absoluterelativeautoDetect(即,首先检查相对路径,在失败的情况下选择绝对路径)。
然而,在需要调用驻留在嵌套子目录中的各种脚本的工作区中,开发人员可能很难设置他们的任务;因为这样的脚本很少以统一的方式报告文件路径(例如,相对于工作空间的基目录)。
为了帮助缓解此问题,此版本中引入了名为search的新文件定位方法。使用此方法,将启动深入文件系统搜索以定位任何捕获的路径。有关如何设置search文件定位方法的信息,请参阅以下示例(尽管所有参数都是可选的):

// ...
    "fileLocation": [
        "search",
        {
            "include": [ // Optional; defaults to ["${workspaceFolder}"]
                "${workspaceFolder}/src",
                "${workspaceFolder}/extensions"
            ],
            "exclude": [ // Optional
                "${workspaceFolder}/extensions/node_modules"
            ]
        }
    ],
    // ... } ```

⚠️ Of course, users should be wary of the possibly **heavy file system
searches** (e.g., looking inside `node_modules` directories) and set
the `exclude` property with discretion.

相关问题