如何在'script:'中使用YAML中的多行命令?

时间:2016-08-03 13:56:12

标签: bash continuous-integration yaml travis-ci

我有一个使用Travis CI的存储库,在.travis.yml我有这一行:

script:
- vim -Nu <(cat <<-EOF
  set nocompatible |
  filetype off
  EOF
  ) -c 'Script' > /dev/null

可悲的是,这不起作用,因为它被转换为单行并且执行如下:

vim -Nu <(cat <<-EOF set no compatible | filetype off | EOF ) -c 'Script' > /dev/null

这使得EOF代码无效,因为EOF需要在一行中。 另一种方法是使用这样的常规引号:

script:
- vim -Nu <(cat 'set nocompatible |
  filetype off
  ) -c 'Script' > /dev/null

哪个有效,并且很好,但我觉得必须有一种方法可以在.travis.yml中插入换行符。我现在有另一种选择,但将来我可能不会。那你怎么做的?

3 个答案:

答案 0 :(得分:33)

在YAML中,您可以使用""引用并转义换行符(\n)来指定标量中的换行符,或者,对于您的情况更为自然,使用{{3} }:

script:
- |
  vim -Nu <(cat <<-EOF
  set nocompatible |
  filetype off
  EOF
  ) -c 'Script' > /dev/null

这是一个标题,以带有|(管道符号)的行开头,后跟多行,其中保留了换行符。

  • 这些行通常是缩进的(例外:单个顶级文字样式块标量)。
  • |之后可以有修饰符:1 - 9,当第一行以空格开头时使用; +-影响最终换行符的删除(通常会合并为一行)。

答案 1 :(得分:14)

我使用这种格式来达到预期的效果

script:
    - >
      valgrind
      --read-var-info=yes
      --error-exitcode=1
      --fullpath-after=
      --track-origins=yes
      --leak-check=full
      --num-callers=20
      --suppressions=$(pwd)/tests/zephir_parser.3.7.0.sup
      $(phpenv which php)
          -d variables_order=EGPCS
          run-tests.php
              -p $(which php)
              -d extension=$(pwd)/modules/zephir_parser.so
              -d variables_order=EGPCS
              -g "FAIL,XFAIL,BORK,WARN,LEAK,SKIP"
              --offline
              --show-diff
              --set-timeout 120

答案 2 :(得分:1)

您正在寻找的是|。这里有一个非常清晰的例子可以参考。

   build:
     commands:
       - echo "${CODEBUILD_BUILD_ARN}"
       - |
         if expr "${CODEBUILD_BUILD_ARN}" : ".*build/MyProjectDev-" >/dev/null; then
           yarn run build-dev;
         fi
       - |
         if expr "${CODEBUILD_BUILD_ARN}" : ".*build/MyProject-" >/dev/null; then
           yarn run build-prod;
         fi