【问题标题】:How to break a single command inside a `script` step on multiple lines如何在多行的“脚本”步骤中打破单个命令
【发布时间】:2020-03-30 13:55:49
【问题描述】:

我们有一个使用 Azure Pipeline 的项目,依赖于 repo 根目录下的 azure-pipelines.yml 文件。

在实现script 步骤时,可以在同一步骤中执行连续的命令,只需将它们写在不同的行上:

- script: |
  ls -la
  pwd
  echo $VALUE

然而,如果我们有一个很长的命令,我们希望能够在 YAML 文件中将它分成几行,但找不到相应的语法?

【问题讨论】:

  • 嗨@Ad N 你试过下面的答案吗,它对你有用吗?如果有任何问题,请告诉我。

标签: yaml azure-pipelines


【解决方案1】:

您没有指定您的代理操作系统,所以我在windows-latestubuntu-latest 上都进行了测试。请注意,脚本任务在这 2 个环境中的运行方式略有不同。在 Windows 上,它使用 cmd.exe。在 Ubuntu 上,它使用 bash。因此,您必须使用正确的语法。

在 Windows 上:

pool:
  vmImage: 'windows-latest'

steps:
- script: |
    mkdir ^
    test ^
    -p ^
    -v

在 Ubuntu 上:

pool:
  vmImage: 'ubuntu-latest'

steps:
- script: |
    mkdir \
    test \
    -p \
    -v

上述两个文件适用于我的 Azure DevOps。

【讨论】:

  • 感谢您的回复。然后我们假设这个语法实际上被转发到进行解释的底层 shell。遗憾的是,由于我们严重依赖跨 Windows 和 Linux/macOS 的矩阵构建,因此我们不能依赖于不同的语法,具体取决于底层代理操作系统。
【解决方案2】:

目前,我们发现在多行中中断单个命令的唯一方法是使用 YAML 折叠样式

- script: >
    echo
    'hello world'

这就是用> 替换|

注意事项:

  • 不可能在以下几行中引入额外的缩进!例如,尝试对齐给定命令的所有参数会破坏行为。
  • 此样式将用一个简单的空格替换提供的值中的换行符。这意味着脚本现在只能包含 单个命令(也许在行尾添加文字 \n 实际上会在字符串中引入换行符,但与通常的方法相比感觉落后除非添加了明确的延续,否则自动换行)。

【讨论】:

  • 嗨 @Ad N 既然您使用 yaml 折叠样式 > 解决了这个问题。您可以接受它作为答案。
【解决方案3】:

您可以使用 '^' 将命令行分成多行。检查下面的例子。下面的脚本将像单行命令一样输出'hello world' echo 'hello world'

- script: |
    echo ^
    'hello ^
    world'

【讨论】:

  • 我刚才能够测试,据我所知,脚本仍然将每一行视为单独的命令,从而破坏了预期的行为。
猜你喜欢
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 2019-08-15
相关资源
最近更新 更多