输入数量未知的 Azure 管道自定义任务

Azure pipeline custom task with an unknown number of inputs

我正在使用 TypeScript 为 Azure 管道创建自定义任务。

我定义了一个filePath输入:

{
    "name": "myFile",
    "label": "file to read",
    "type": "filePath",
    "required": true,
    "groupName": "files",
    "helpMarkDown": "file to read",
    "defaultValue": "",
    "visibleRule": "getFile = true"
},

用户应该能够在任务中定义未知数量的路径。

  1. 有没有办法以某种方式在任务中动态生成输入,如果用户浏览路径,gui 将显示另一个 filePath 输入?如果有这样的选项,我怎样才能遍历它们并将所有文件下载到管道?

  2. 1 的替代方案 - 我可以有一个简单的字符串输入,我可以在其中指示用户输入多个路径。在这种情况下,用户如何在没有 filePath 输入给你的浏览按钮帮助的情况下提取 repo 中文件的路径?

大多数任务提供多行文本框(可选择调整大小),您可以在 task.json:

中设置
{
      "name": "patternManifest",
      "type": "multiLine",
      "properties": {
        "resizable": true,
        "rows": "1"
      },
      "label": "Manifest file(s)",
      "defaultValue": "vss-extension.json",
      "required": false,
      "helpMarkDown": "Specify the pattern for manifest files. One file per line."
    },

然后在任务本身中你使用 tl.getDelimitedInput() 并传入你想要支持的分隔符,在这个任务中我要求他们使用换行符 \n:

const globsManifest = tl.getDelimitedInput("patternManifest", "\n", false);

任务库也支持通配符匹配,这样人们就可以将 ***? 添加到他们的输入中,任务会将这些解析为实际文件,然后使用 tl.findMatch() 选项。

            if (vsixFilePattern.indexOf("*") >= 0 || vsixFilePattern.indexOf("?") >= 0) {
                tl.debug("Pattern found in vsixFile parameter.");
                matchingVsixFile = tl.findMatch(process.cwd(), vsixFilePattern);
            }
            else {
                tl.debug("No pattern found in vsixFile parameter.");
                matchingVsixFile = [vsixFilePattern];
            }

默认情况下路径是相对的,并使用任务的工作目录。当指定 none 时,工作目录取决于任务的上下文(构建与部署管道):

  "execution": {
    "PowerShell3": {
      "target": "$(currentDirectory)\TfvcCheckin.v3.ps1",
      "workingDirectory": "$(Build.SourcesDirectory)"
    }
  }

用户始终可以输入绝对路径而不是相对路径。他们总是可以添加像 $(Build.SourcesDirectory)\a\b\c 这样的变量来将路径根目录到预定义的位置。