【发布时间】:2016-10-04 06:42:53
【问题描述】:
我想在我的appveyor.yml 文件中将一个长构建命令拆分为多行,但是我无法将其解包,因此当第一个FOR 命令被切断并返回错误时,构建失败。我不确定如何正确拆分 .yml 文件中的行,以便在 Appveyor 中重新组装它们。如何做到这一点?
这是一个简化版:
build_script:
- cmd: >-
@echo off
FOR %%P IN (x86,x64) DO ( ^
FOR %%C IN (Debug,Release) DO ( ^
msbuild ^
/p:Configuration=%%C ^
/p:Platform=%%P ... ^
|| EXIT 1 ^
) ^
)
我希望它在 AppVeyor 中显示为:
@echo off
FOR %%P IN (x86,x64) DO ( FOR %%C IN (Debug,Release) DO ( msbuild /p:Configuration=%%C /p:Platform=%%P ... || EXIT 1 ) )
多余的空格并不重要,重要的是以FOR 开头的行直到最后的) 出现在同一行。
请注意,理论上 Appveyor 也可以接受:
@echo off
FOR %%P IN (x86,x64) DO ( ^
FOR %%C IN (Debug,Release) DO ( ^
msbuild ^
/p:Configuration=%%C ^
/p:Platform=%%P ... ^
|| EXIT 1 ^
) ^
)
因为 Windows cmd.exe 解释器随后会在每一行的末尾看到继续标记 (^) 并将它们视为一个大长命令,除了 Appveyor 似乎没有识别^ 标记,因此它一次将每一行发送到cmd.exe,而不是一起发送整个多行块。
这意味着第一个选项看起来是唯一可行的解决方案,其中构建 YAML 时将 FOR 行及其后的所有内容合并为一行。
我试过了:
- 每行末尾没有多余字符的单个间距。根据this guide 的说法,单行距的 YML 行应该被解包成一行,但 Appveyor 不会发生这种情况。
- 双倍行距,每行末尾没有多余的字符。这应该使每一行成为一个单独的命令,实际上它们是,因为第一个
FOR命令失败并出现error 255因为它不完整(只有FOR行存在,而不是循环的其余部分。) - 双倍行距以
^结尾。 Appveyor 一次只运行一行,所以我在第一个不完整的FOR命令上得到一个error 255。 - 单行距以
^结尾,如上所示。与双倍行距相同的问题,error 255来自不完整的FOR命令。 - 在运行单独的命令(例如多个
msbuild语句)时,以&& ^结束每一行确实有效,但这不适用于FOR循环,因为如果没有前面的命令,您就不能拥有&&它。
在appveyor.yml 中将单个cmd 命令拆分为多行是否有技巧?
【问题讨论】: