16

長いビルド コマンドをファイル内の複数の行に分割したいのappveyor.ymlですが、アンラップできないため、最初のFORコマンドが途切れてエラーが返されるとビルドが失敗します。.ymlAppveyor 内で再構築されるように、ファイル内の行を正しく分割する方法がわかりません。これはどのように行うことができますか?

ここに簡略化されたバージョンがあります:

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ある継続マーカー ( )を認識し、それらを 1 つの大きな長いコマンドとして扱います。複数行ブロック全体を一緒に送信します。^^cmd.exe

FORこれは、行とそれ以降のすべてが 1 行に結合されるように YAML が構築されている場合、最初のオプションが唯一の実行可能なソリューションのように見えることを意味します。

私が試してみました:

  • 各行の終わりに余分な文字を含まないシングル スペース。このガイドによると、シングル スペースの YML 行は 1 行にアンラップされるはずですが、Appveyor ではこれが行われません。
  • 各行の終わりに余分な文字がないダブルスペース行。これは、各行を個別のコマンドにすることを想定しており、実際には、最初のコマンドが不完全であるためにFOR失敗するためです (行のみが存在し、ループの残りの部分は存在しません)。error 255FOR
  • で終わるダブルスペース行^。Appveyor は一度に 1 行ずつしか実行しないためerror 255、最初の不完全なFORコマンドでエラーが発生します。
  • ^上記のようにで終わるシングルスペース行。error 255不完全なFORコマンドからのダブルスペース行と同じ問題。
  • && ^個別のコマンド (複数のmsbuildステートメントなど) を実行する場合、各行を で終了することは実際には機能しますが、これはFORループでは機能しません&&

cmdで単一のコマンドを複数の行に分割するトリックはありappveyor.ymlますか?

4

5 に答える 5

8

appveyor.yml でコマンドを複数行に分割する方法は?

以下に、batch、cmd、ps の構文例をいくつか示します。

これらの例が時間を節約できることを願っています...

構文例

バッチ

# please note the & at EOL in the next example
install:
    # Install VULKAN_SDK 
    - if not exist %VULKAN_SDK% (
       curl -L --silent --show-error --output Vulkan_SDK_Installer.exe https://sdk.lunarg.com/sdk/download/%VULKAN_VERSION%/windows/VulkanSDK-%VULKAN_VERSION%-Installer.exe?Human=true &
       Vulkan_SDK_Installer.exe /S
    )
    - dir %VULKAN_SDK%

before_build:
  - |-
    set MINGW32_ARCH=i686-w64-mingw32
  - if exist %PREFIX% set NEEDDEPENDS=rem

  # Depends
  - |-
    %NEEDDEPENDS% mkdir %PREFIX%\include\SDL2
    %NEEDDEPENDS% mkdir %PREFIX%\lib
    %NEEDDEPENDS% cd %TEMP%
    %NEEDDEPENDS% appveyor DownloadFile https://sourceforge.net/projects/gnuwin32/files/gettext/0.14.4/gettext-0.14.4-lib.zip
    %NEEDDEPENDS% mkdir gettext-0.14.4-lib
    %NEEDDEPENDS% move gettext-0.14.4-lib.zip gettext-0.14.4-lib
    %NEEDDEPENDS% cd gettext-0.14.4-lib
    %NEEDDEPENDS% 7z x gettext-0.14.4-lib.zip > nul
    %NEEDDEPENDS% copy include\* %PREFIX%\include > nul
    %NEEDDEPENDS% copy lib\* %PREFIX%\lib > nul
    %NEEDDEPENDS% cd ..

deploy_script:
  # if tagged commit, build/upload wheel
  - IF "%APPVEYOR_REPO_TAG%"=="true" IF NOT "%TESTENV%"=="check" (
      pip install twine &&
      python setup.py register &&
      twine upload -u %PYPI_USER% -p %PYPI_PASS% dist/*
    )

CMD

before_build:
    - cmd: >-     

        mkdir build

        cd .\build

        set OpenBLAS_HOME=%APPVEYOR_BUILD_FOLDER%/%MXNET_OPENBLAS_DIR%

        set OpenCV_DIR=%APPVEYOR_BUILD_FOLDER%/%MXNET_OPENCV_DIR%/build

        cmake .. -DOPENCV_DIR=%OpenCV_DIR% -DUSE_CUDA=0 -DUSE_CUDNN=0 -DUSE_NVRTC=0 -DUSE_OPENCV=1 -DUSE_OPENMP=1 -DUSE_BLAS=open -DUSE_DIST_KVSTORE=0 -G "Visual Studio 12 2013 Win64"

PS

install:
    - ps: >-

        git submodule init

        git submodule update

        if (!(Test-Path ${env:MXNET_OPENBLAS_FILE})) {

            echo "Downloading openblas from ${env:MXNET_OPENBLAS_PKG} ..."

            appveyor DownloadFile "${env:MXNET_OPENBLAS_PKG}" -FileName ${env:MXNET_OPENBLAS_FILE} -Timeout 1200000
        }

install:
      - ps: |
          Add-Type -AssemblyName System.IO.Compression.FileSystem
          if (!(Test-Path -Path "C:\maven" )) {
            (new-object System.Net.WebClient).DownloadFile('https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip', 'C:\maven-bin.zip')
            [System.IO.Compression.ZipFile]::ExtractToDirectory("C:\maven-bin.zip", "C:\maven")
          }

on_success:
  - ps: |
  if ($true)
  {
    Write-Host "Success"
  }
于 2016-09-09T10:03:22.677 に答える
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 )
)

次に、Python などからダンプすることで、適切な YAML を簡単に生成できます。

import sys
import ruamel.yaml

appveyor_str = """\
@echo off
FOR %%P IN (x86,x64) DO (
    FOR %%C IN (Debug,Release) DO ( msbuild /p:Configuration=%%C /p:Platform=%%P ... || EXIT 1 )
)
"""

data = dict(build_script=[dict(cmd=appveyor_str)])

ruamel.yaml.round_trip_dump(data, sys.stdout)

あなたにあげる:

build_script:
- cmd: "@echo off\nFOR %%P IN (x86,x64) DO (\n    FOR %%C IN (Debug,Release) DO (\
    \ msbuild /p:Configuration=%%C /p:Platform=%%P ... || EXIT 1 )\n)\n"

(上記の例では改行の前にスペースはありません)

折りたたみブロック スタイルのスカラーを ( と共に)使用する>と、経験したようにスカラーの折りたたみをほとんど制御できなくなります。折り畳まれた (またはリテラル) ブロック スタイルのスカラーでシーケンスをエスケープすることもできません。

複数行の文字列にエスケープが必要ない場合は、ブロック スタイルのスカラーとしてダンプを試みることができます。

import sys
import ruamel.yaml

appveyor_str = """\
@echo off
FOR %%P IN (x86,x64) DO (
    FOR %%C IN (Debug,Release) DO ( msbuild /p:Configuration=%%C /p:Platform=%%P ... || EXIT 1 )
)
"""

data = dict(build_script=[dict(cmd=ruamel.yaml.scalarstring.PreservedScalarString(appveyor_str))])

ruamel.yaml.round_trip_dump(data, sys.stdout)

これは次を与えます:

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 )
    )

(つまり、正確に入力したもの)

すべてを右揃えすると、必要な出力が得られます:

import sys
import ruamel.yaml

yaml_str = """\
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
    )
    )
"""

data = ruamel.yaml.load(yaml_str)

print(data['build_script'][0]['cmd'])

与えます:

@echo off
FOR %%P IN (x86,x64) DO ( FOR %%C IN (Debug,Release) DO ( msbuild /p:Configuration=%%C /p:Platform=%%P ... || EXIT 1 ) )

ただし、インデントすることはできません (折りたたみブロック スタイルのスカラーの詳細から)。

空白文字で始まる行 (よりインデントされた行) は折り畳まれません。

于 2016-06-04T10:29:37.777 に答える