我想在我的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
行和其后面的所有内容组合成单行。
我已尝试了以下方法:
- 每行末尾没有额外字符的单倍行距。根据这份指南,单倍行距的 YML 应该展开成一行,但是在 Appveyor 中不会发生。
- 每行末尾没有额外字符的双倍行距。这应该使每行成为单独的命令,确实如此,因为第一个
FOR
命令失败,出现错误 255
,因为它不完整(只有FOR
行而没有循环的其余部分)。 - 每行末尾带有
^
的双倍行距。Appveyor 只会逐行运行,因此第一个不完整的FOR
命令会出现错误 255
。 - 如上所示,每行末尾带有
^
的单倍行距。与双倍行距相同问题,由于不完整的FOR
命令,会出现错误 255
。 - 在每行末尾加上
&& ^
实际上可以在运行独立命令时(例如多个msbuild
语句)起作用,但这对于FOR
循环来说是行不通的,因为你不能在没有前置命令的情况下使用&&
。
有没有什么诀窍可以将单个 cmd
命令拆分成多行在 appveyor.yml
中实现?
.yml
行重新组合成单行命令? - Malvineoussetlocal enabledelayedexpansion
在这里也可能有帮助,但我还没有尝试过。 - Steve Chavez