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

hgi*_*sel 30 bash continuous-integration yaml travis-ci

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

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

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

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

这使得EOF标签不起作用,因为EOF需要在一行中.另一种方法是使用这样的常规引号:

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

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

Ant*_*hon 39

在YAML中,您可以通过使用""引号和转义换行符来指定标量中的换行符\n,或者,对于您的情况,通过使用文字样式块标量更自然:

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

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

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


ser*_*hei 19

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

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
Run Code Online (Sandbox Code Playgroud)

  • @ChaimEliyah YAML在第一个管道之后没有解释换行之外的标量内容,其他一切都是"按原样"(直到你为止). (2认同)

Shi*_*and 9

您正在寻找的是|. 这是一个非常清楚的例子可供参考。

   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
Run Code Online (Sandbox Code Playgroud)