我在VSTS版本管理中有删除文件的任务。我希望内容来自变量。我创建了一个变量,但我无法弄清楚如何创建一个多行变量。例如,删除三种类型文件的变量:
变量名称= ExcludeFiles
变量值=“Lib”“bin \ * .pdb”“bin \ * .dll.config”
答案 0 :(得分:4)
可以使用具有多个逻辑行的变量作为多行任务参数的输入,但它可能不适用于每个任务。使用VS Test 2.x任务在VSTS上测试此方法,我将在下面作为示例使用。我希望它适用于Microsoft提供的大多数任务。
任务通过JSON文件定义一组参数。除了UI中显示的显示名称外,每个参数都有一个内部名称。可以使用任务上的“链接设置”按钮(或通过查找任务的源代码)查看内部参数名称。
在“链接设置”对话框中,VS Test 2.x任务有一个名为“测试程序集”的“设置链接”,它是一个多行字符串。查看“Process parameter to link to this setting”,我们看到值“Parameters.testAssemblyVer2”。 testAssemblyVer2是内部参数的名称。
当任务执行时,需要获取其参数的值。大多数任务通过在当前环境变量中搜索以“INPUT_”开头的任何内容来完成此操作。对于testAssemblyVer2,任务将查找名为INPUT_TESTASSEMBLYVER2的环境变量。
在任务执行之前,我们可以将分隔的变量值转换为编码的多行值,并将其写入环境变量中,然后由任务选择它。
首先,使用分号分隔的值**\$(BuildConfiguration)\*.tests.dll;!**\obj\**
定义变量“Custom.TestAssemblies”。分号将成为分割线。
接下来,在VS Test任务之前向构建过程添加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匹配。
如果将变量system.debug
设置为true
,通常会在跟踪输出中看到各种INPUT_参数和一些解析。这取决于具体任务的实施。
此解决方案应该同样适用于构建和发布序列。
答案 1 :(得分:2)
Bash 解决方案:
emailbody=$(echo "$output" | sed ':a;N;$!ba;s/\n/%0D%0A/g')
答案 2 :(得分:1)
不支持多行变量,我在此处提交用户语音:Multiple lines variable in Build and Release。
根据删除文件任务的源代码,它将内容值拆分为'\ n',但根据我的测试,将'\ n'添加到变量不起作用(例如t1.txt \ n t2.txt或者t1.txt \ nt2.txt)。
您可以根据“删除文件”任务的源代码自定义构建/发布任务,也可以使用逻辑对其执行,并通过PowerShell /命令行任务执行该任务。
答案 3 :(得分:1)
Thomas F. Abraham的PowerShell解决方案解决了我的问题。此修改使其更简单,不需要输入参数:
$newline = "%0D%0A `t"
Write-Host "##vso[task.setvariable variable=LineBreak]$newline"
我还添加了一个制表符,以便下一行缩进。然后只要在需要的地方引用变量$(LineBreak)。