Как передать установочные каталоги MSBuild в пакетную команду Windows - PullRequest
0 голосов
/ 17 июня 2019

Некоторое время мы использовали Jenkins, в основном создавая VS-решения с помощью плагина MsBuild.

В этом есть одна вещь, которая нам действительно не нравится - вы конфигурируете, какую версию VS вы хотите собрать в Jenkins. Это означает, что если вы перемещаете проект из одной версии в другую, вы нарушаете сборку.

Либо вы изменяете задание Jenkins для сборки с новой версией VS и нарушаете сборку всех старых ревизий, либо вы не изменяете и не нарушаете все новые ревизии, либо вы создаете два задания Jenkins и должны знать, какие использовать для какой ревизии.

Итак, мы хотим сделать шаг назад, добавив compile-project.bat в каждый проект, и попросив Дженкинса просто вызвать командный файл.

Но это создает проблему пути. Как пакетный файл узнает, где установлена ​​конкретная версия VS? Мы могли бы сделать требование, чтобы каждая версия VS всегда была установлена ​​в известном месте, за исключением того, что мы знаем, что этого не произойдет.

Если мы можем предположить, что на каждом ведущем и подчиненном устройстве Jenkins правильно настроены установки MSBuild, есть ли способ передать эти пути в командный файл?

Ответы [ 3 ]

1 голос
/ 18 июня 2019

Общей проблемой является поиск места установки , когда мы знаем, какую версию мы ищем.Так как здесь вы также спрашиваете о различных версиях , я думаю, что у вас нет правильного пути, и вам нужно будет использовать один из вариантов.

Объявление на машине

СкриптАргументы

Как сказал Ланс Ли-MSFT в своем ответе, вы можете создать скрипт, который принимает пути в качестве параметров и решает, какой из них использовать.

Я думаю, что недостаток этого решения в том, что оно подходит только для процесса CI, и его сложно запустить на машине разработчика.И вам все равно нужно найти путь на каждой машине.

Переменные среды

Другой вариант - сохранить пути установки в переменных среды и использовать их в сценарии.

Переменные среды должны быть установлены один раз при установке Visual Studio или при создании виртуальной машины, и скрипт получит к ним доступ столько, сколько пожелает.

Нам все еще нужно определить пути как переменные среды в машине разработки .Если у вас много разработчиков - это значит много писем.

Объявление скриптом

Поскольку не будет бесконечного списка путей установки, я бы порекомендовал поискать существующийпуть при запуске сценария .

Это выглядит немного плохо, когда вы смотрите на файл, но помните, что список окончательный и определен в одном месте ,и нет никаких недостатков, которые мы описали в других опциях.

Примеры

Вот пример поиска Командная строка разработчика для VS 17 , для машины для разработки (Enterprise, Professional) и машины CI (BuildTools).

Кстати, он добавляет в переменные среды все виды важных вещейнапример, путь к msbuild и т. д.

.bat:

@echo off
if NOT DEFINED VSINSTALLDIR goto SetVars
echo VSINSTALLDIR already set to %VSINSTALLDIR%
goto :eof

:SetVars
if EXIST "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Enterprise" goto :Enterprise
if EXIST "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Professional" goto :Professional
if EXIST "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\BuildTools" goto :Docker

echo VS2017 is not installed on this machine
goto :eof

:Enterprise
call "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\enterprise\common7\tools\VsDevCmd.bat"
goto :eof

:Docker
call "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\BuildTools\common7\tools\VsDevCmd.bat"
goto :eof

:Professional
call "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Professional\common7\tools\VsDevCmd.bat"

:eof

msbuild script :

<VsDevCmd Condition="Exists('C:\Program Files (x86)\Microsoft Visual Studio\2017\enterprise\common7\tools\VsDevCmd.bat')">
  "C:\Program Files (x86)\Microsoft Visual Studio\2017\enterprise\common7\tools\VsDevCmd.bat"</VsDevCmd>
<VsDevCmd Condition="Exists('C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\common7\tools\VsDevCmd.bat')">
  "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\common7\tools\VsDevCmd.bat"</VsDevCmd>
<VsDevCmd Condition="Exists('C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\common7\tools\VsDevCmd.bat')">
  "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\common7\tools\VsDevCmd.bat"</VsDevCmd>
1 голос
/ 18 июня 2019
  1. Как сказал Барух в комментарии, большую часть времени более высокая версия msbuild может создавать проекты из более ранней версии.

    Таким образом, вы можете настроитьболее поздняя версия msbuild в jenkins независимо от того, пришел ваш проект из более ранней версии или нет.

  2. А что значит "передать путь к пакетному файлу"?

    Что-то вроде на этот вопрос ?

    если это так, вы можете просто использовать %1 и %2 в файле .bat и передавать в него путь или другой параметр с помощью командной строки, например xxx.bat para1 para2.

0 голосов
/ 25 июня 2019

C Джонсон предложил посмотреть на VSWhere , и это очень хорошо решает проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...