可以使用具有多个逻辑行的变量作为多行任务参数的输入,但它可能不适用于每个任务。使用 VS Test 2.x 任务在 VSTS 上测试此方法,我将在下面用作示例。我希望它适用于大多数 Microsoft 提供的任务。
背景
任务通过 JSON 文件定义一组参数。除了 UI 中显示的显示名称外,每个参数都有一个内部名称。可以使用任务上的“链接设置”按钮(或通过查找任务的源代码)查看内部参数名称。
在“链接设置”对话框中,VS Test 2.x 任务有一个名为“测试程序集”的“设置链接”,它是一个多行字符串。查看“链接到此设置的流程参数”,我们看到值“Parameters.testAssemblyVer2”。 testAssemblyVer2 是内部参数的名称。
当一个任务执行时,它需要获取它的参数值。大多数任务通过在当前环境变量中搜索以“INPUT_”开头的任何内容来执行此操作。对于 testAssemblyVer2,该任务将查找名为 INPUT_TESTASSEMBLYVER2 的环境变量。
就在任务执行之前,我们可以将一个定界变量值转换为一个编码的多行值,并将其写入环境变量中被任务提取的位置。
解决方案
首先,使用分号分隔值**\$(BuildConfiguration)\*.tests.dll;!**\obj\** 定义一个变量“Custom.TestAssemblies”。分号将成为行拆分。
接下来,在 VS 测试任务之前将 PowerShell 任务添加到构建过程。将其配置为带有一个参数"$(Custom.TestAssemblies)" 的内联脚本。在这里,双引号很关键。
内联脚本如下所示:
Param([String]$toMultiLine)
$newlineDelimited = $toMultiLine -replace ';', "%0D%0A"
Write-Host "##vso[task.setvariable variable=INPUT_TESTASSEMBLYVER2]$newlineDelimited"
就是这样!变量值中的分隔符被转换为 URL 编码的 CR/LF,并指示代理使用该值更新 INPUT_TESTASSEMBLYVER2。该任务获取该值并将其解析为“\n”,它与嵌入的 %0D%0A 匹配。
总结
- 选择一个分隔符,如 ;并用它来划分变量值的各个部分
- 使用“链接设置”获取任务的内部参数名称
- 在目标任务之前插入 PowerShell 任务并插入上面的代码,替换正确的变量和任务参数名称
如果您将变量system.debug 设置为true,您通常会在跟踪输出中看到各种INPUT_ 参数和一些解析。这取决于具体任务的实现。
此解决方案应该同样适用于构建和发布序列。