Как запустить VCUpgrade перед сборкой Appveyor?

Мы распространяем набор файлов проекта Visual Studio 2010. Ожидается, что пользователи будут обновляться в соответствии с их вкусом. Наш .appveyor.yml файл включает следующие изображения (в дополнение к конфигурациям и платформам):

  • Visual Studio 2017
  • Visual Studio 2015
  • Visual Studio 2013
  • Visual Studio 2012
  • Visual Studio 2010

Сбой сборки Visual Studio 2017:

Build started
git clone -q --depth=3 --branch=master https://github.com/noloader/cryptopp.git C:\projects\cryptopp
git checkout -qf 3504f1da2591d8b84e356527ed41dc6209eafa06
msbuild "C:\projects\cryptopp\cryptest.sln" /verbosity:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
Microsoft (R) Build Engine version 15.1.1012.6693
Copyright (C) Microsoft Corporation. All rights reserved.
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.Cpp.Platform.targets(55,5): error MSB8020: The build tools for Visual Studio 2010 (Platform Toolset = 'v100') cannot be found. To build using the v100 build tools, please install Visual Studio 2010 build tools.  Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Retarget solution". [C:\projects\cryptopp\cryptlib.vcxproj]
Command exited with code 1

Текст, представляющий интерес:

ошибка MSB8020: средства сборки для Visual Studio 2010 (Platform Toolset = 'v100') не могут быть найдены. Чтобы создать с помощью инструментов сборки v100, установите инструменты сборки Visual Studio 2010. Кроме того, вы можете перейти к текущим инструментам Visual Studio, выбрав меню "Проект" или щелкнув правой кнопкой мыши на решении, а затем выбрав "Retarget solution".

Когда я работаю из командной строки разработчика, я запускаю VCUpgrade или я использую GitBash и sed -i s'|Tools>v100|Tools>v120' *vcxproj* для изменения набора инструментов платформы.

Когда я пытаюсь запустить его через AppVeyor test_script:, это приведет к другому сбою. Например, из журнала 1.0.131:

...
vcupgrade.exe -nologo -overwrite cryptlib.vcxproj
'vcupgrade.exe' is not recognized as an internal or external command,
operable program or batch file.
Command exited with code 1

Мой вопрос: как мы можем сообщить Appveyor об изменении набора инструментов платформы? Есть ли способ или вариант конфигурации для запуска VCUpgrade? Или мы делаем что-то еще?


Это помощь, предоставляемая при локальном запуске VCUpgrade:

> vcupgrade
Microsoft (R) Visual C++ Project Convert Utility - Version 11.00.61030
Copyright (C) Microsoft Corporation. All rights reserved.

  Usage: VCUpgrade [options] <project file>

  Options:
     -nologo            Suppresses the copyright message
     -nocolor           Do not output error and warning messages in color
     -overwrite         Overwrite existing files
     -PersistFramework  Keep the Target Framework Version while upgrading. (-p)

Ответ 1

AppVeyor в настоящее время предоставляет сбор рабочих изображений с VS 2013, 2015 и 2017 гг.. На данный момент не планируется добавлять VS 2010 и 2012, извините.

Интересным вариантом для вас может быть пользовательская среда сборки. Это "гибридное" решение, где у вас есть инфраструктура и изображения, а AppVeyor обеспечивает интерфейс и оркестровку. Документация для Azure и Hyper-V доступна сейчас, документация для других поставщиков находится на этом пути.

Обратите внимание, что теперь для заказчиков премиум-класса доступны настраиваемые среды сборки. Если вы хотите попробовать, отправьте сообщение в команду на appveyor.com.

Ответ 2

VCUpgrade может не существовать в зависимости от используемого набора инструментов. Например, у меня это для VS2013, VS2015, но не для VS2017. Соответствующая функциональность devenv /upgrade my.vcxproj, хотя она доступна, по крайней мере, из VS2013, возможно, раньше. И вы можете запустить его как дополнительный шаг сборки в Appveyor, если бы вы не использовали настраиваемый макет проекта, который devenv не хочет касаться.

Либо сделайте файл проекта совместимым с несколькими версиями VS, заменив V100 в файле проекта $(DefaultPlatformToolset), как выложил в другом вопросе на эту тему, или заменить V100 вручную. Я не знаю, установил ли appveyor путь по умолчанию, но вы можете сделать сборки Powershell вместо этого, и PS имеет подобные sed возможности. Вам нужно вывести набор инструментов вручную в зависимости от используемого ими образа строителя. Что-то вроде этого делает трюк:

configuration:

- Debug
- Release

platform:

- x86
- x64

image:

- Visual Studio 2017
- Visual Studio 2015
- Visual Studio 2013

build_script:

- ps: >-

    if ($env:APPVEYOR_BUILD_WORKER_IMAGE -eq "Visual Studio 2013") {
      $PlatformToolset = "v120"
    } elseif ($env:APPVEYOR_BUILD_WORKER_IMAGE -eq "Visual Studio 2015") {
      $PlatformToolset = "v140"
    } else {
      $PlatformToolset = "v141"
    }

    (Get-Content cryptlib.vcxproj) | %{$_ -replace "v100", $PlatformToolset} | Set-Content cryptlib.vcxproj

    (Get-Content cryptest.vcxproj) | %{$_ -replace "v100", $PlatformToolset} | Set-Content cryptest.vcxproj

    & msbuild cryptlib.vcxproj "/p:platform=$env:platform;configuration=$env:configuration"

    & msbuild cryptest.vcxproj "/p:platform=$env:platform;configuration=$env:configuration"